{"id":3386,"date":"2020-07-13T12:37:15","date_gmt":"2020-07-13T03:37:15","guid":{"rendered":"\/blog\/?p=3386"},"modified":"2023-09-21T09:26:40","modified_gmt":"2023-09-21T00:26:40","slug":"ssc-api-%ec%98%88%ec%a0%9c-python-%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c","status":"publish","type":"post","link":"https:\/\/hasu0707.duckdns.org\/blog\/?p=3386","title":{"rendered":"[SSC] API \uc608\uc81c python \uc18c\uc2a4\ucf54\ub4dc"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import requests\nimport sys, getopt\nfrom pprint import pprint\n\n# https:\/\/community.microfocus.com\/t5\/Fortify-User-Discussions\/How-to-create-application-in-SSC-with-REST-API\/td-p\/1553209\n# python pip.exe install requests\n#\n# Following are the steps that this script takes.\n# Use Basic Auth to obtain a token\n# Use token in order to perform a project lookup\n#   If the project doesn't exist, the project and project version will be created\n#   1. Make call to projectVersions to create Project and Version\n#   2. Make call to projectVersions\/attributes to update the project attributes\n#   3. Update projectVersions resource to be enabled.\n# Use token in order to perform a project version lookup\n# If the project version doesn't exist the project version will be created\n\nbaseURL = \"http:\/\/10.10.10.31:8080\/ssc\/api\/v1\/\"\nauthURL = baseURL+\"auth\/obtain_token\"\nprojectURL = baseURL+\"projects?start=-1&amp;limit=-1\"\n\n\nauthHeaders = {\n    'accept': \"application\/json, text\/plain; *\/*\",\n    'content-type': \"application\/json;charset=UTF-8\",\n    'accept-encoding': \"application\/gzip\",\n    'cache-control': \"no-cache\",\n    'authorization': \"Basic &lt;insert basic token>\",\n    }\n#\n# This function will get project information and return the assocaited project ID for the project\n#\ndef getProject( projectHeaders, projectName, projectVersion, projectURL ):\n    print(\"Performing Project Lookup....................\\n\")\n    # Connect to Project Resource to get details on available projects\n    print (\"Connecting to \" + projectURL + \" ...............................\\n\")\n\n    try:\n        projectResponse = requests.request(\"GET\", projectURL, headers=projectHeaders)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Project Response Status Code = \" + str(projectResponse.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n\n    if projectResponse.status_code == 200 :\n        projectJSON = projectResponse.json()\n        projectList = projectJSON['data']\n\n        for projectDict in projectList :\n            if projectDict['name'] == projectName :\n                projectID = projectDict['id']\n                print (\"Project ID Was located.........................................\\n\")\n                print (\"\\n--------------- Project ID from Lookup,  \" + str(projectID) + \"\\n\")\n                print (\"Project ID \"+ str(projectID))\n                versionID = getProjectVersion( projectHeaders, baseURL, projectID, projectVersion, projectName )\n                return projectID;\n                break\n        else:\n            print (\"Project ID was not found, creating new project....................................\")\n\n            returnedVersionID = createProject(projectName, projectVersion, projectHeaders )\n            #print (\"Project ID after project creation \" + str(versionID) + \"\\n\")\n            print (\"Project Version ID after project creation \" + str(returnedVersionID) + \"\\n\")\n            updateProjectAttributes( projectHeaders, returnedVersionID, projectVersion, projectName)\n            updateProject( projectHeaders, returnedVersionID, projectVersion, projectName )\n            return returnedVersionID;\n\n    else :\n        print (\"Project Request experienced an error and returned response code \" + str(projectResponse.status_code) + \"\\n\")\n\n#\n# This function will get project version information and return the assocaited project ID for the project\n#\ndef getProjectVersion( projectHeaders, baseURL, projectID, projectVersion, projectName ):\n    #Get the Project Version data\n    print (\"Looking up Project Version information.........................\\n\")\n    projectVersionURL = baseURL+\"projects\/\"+str(projectID)+\"\/versions\"\n    print (\"\\nConnecting to \" + projectVersionURL + \" ...............................\\n\")\n    try:\n        projectVersionResponse = requests.request(\"GET\", projectVersionURL, headers=projectHeaders)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Project Version Response Status Code = \" + str(projectVersionResponse.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n\n    if projectVersionResponse.status_code == 200 :\n        projectVersionJSON = projectVersionResponse.json()\n        #pprint(projectVersionJSON)\n        # Grab the Data Dictionariy from the JSON\n        projectVersionList = projectVersionJSON['data']\n        #pprint( projectVersionList )\n        # The project version call returns a list of dictionaries.  Loop through the list to get individual dictionaries\n        # After obtaining the individial dictionaries look through each one to see if any of them have a projectVersion that matches\n        # out project version.\n        for projectVersionDict in projectVersionList :\n            if projectVersionDict['name'] == projectVersion :\n                lookupVersionID = projectVersionDict['id']\n                print (\"Project Version ID Was located.........................................\\n\")\n                print (\"\\n--------------- Project Version ID is: \" + str(lookupVersionID) + \"\\n\")\n                return lookupVersionID;\n                break\n        else:\n            print (\"Project Version was not found, We need to create a new project ..............................\\n\")\n            createVersion( projectHeaders, projectID, projectVersion, projectName )\n    return;\n\ndef createProject (projectName, projectVersion, projectHeaders ):\n    print (\"\\n.................................\")\n    print (\"\\n Creating new project................................................\")\n\n    url = \"http:\/\/10.10.10.31:8080\/ssc\/api\/v1\/projectVersions\"\n\n    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\\\"}\"\n    try:\n        response = requests.request(\"POST\", url, data=payload, headers=projectHeaders)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Response Status Code = \" + str(response.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n    print (\"\\n--------------- Project Creation JSON --------------- \\n\")\n    print(response.text)\n    if response.status_code == 201 :\n        projectJSON = response.json()\n        projectData = projectJSON['data']\n        versionID = projectData['id']\n        print (\"\\n.............................. Project Version ID after Project Creation .............................. \\n\")\n        print (\"ProjectVersionID = \" + str(versionID))\n        print (\"\\n....................................................................................................... \\n\")\n        return versionID;\n    else:\n        return;\n\ndef createVersion( projectHeaders, projectID, projectVersion, projectName ):\n    print (\"Creating new Project Version.............................................\\n\")\n    print (\"Creating project Version \" + projectVersion + \" with project ID of \" + str(projectID) + \"\\n\")\n    url = \"http:\/\/10.10.10.31:8080\/ssc\/api\/v1\/projects\/\"+str(projectID)+\"\/versions\"\n\n    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}\"\n    print (\"Creating project version by connecting to \" + url)\n    try:\n        response = requests.request(\"POST\", url, data=payload, headers=projectHeaders)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Response Status Code = \" + str(response.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n    print (projectID)\n    print (response.status_code)\n    if response.status_code == 201 :\n        projectJSON = response.json()\n        pprint( projectJSON )\n        projectData = projectJSON['data']\n        versionID = projectData['id']\n        print (\"\\n.............................. Project Version ID after Project Creation .............................. \\n\")\n        print (\"ProjectVersionID = \" + str(versionID))\n        print (\"\\n....................................................................................................... \\n\")\n        updateProjectAttributes( projectHeaders, versionID, projectVersion, projectName )\n        updateProject( projectHeaders, versionID, projectVersion, projectName )\n        return;\n    return;\n\n\ndef updateProjectAttributes( projectHeaders, projectID, projectVersion, projectName ):\n    print (\"Updating Project Attributes ................................................\\n\")\n    print (\"Updating project Attributes for project \" + projectName + \" with project id of, \" + str(projectID) + \"\\n\")\n    url = \"http:\/\/10.10.10.31:8080\/ssc\/api\/v1\/projectVersions\/\" + str(projectID) + \"\/attributes\"\n\n\n    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\"\n\n    try:\n        response = requests.request(\"PUT\", url, data=payload, headers=projectHeaders)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Response Status Code = \" + str(response.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n\n    print (\"Project Attribute Update Completed................................\\n\")\n    return;\n\ndef updateProject( projectHeaders, projectID, projectVersion, projectName ):\n    print (\"Updating Project Version Status to Committed ................................................\\n\")\n    print (\"Changing Project Version Status to Committed for project \" + projectName + \" with with project id of, \" + str(projectID) + \"\\n\")\n\n    url = \"http:\/\/10.10.10.31:8080\/ssc\/api\/v1\/projectVersions\/\"+str(projectID)+\"\/\"\n    print (\"Connecting to \" + url)\n\n    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\\\"}\"\n    print (payload)\n    try:\n        response = requests.request(\"PUT\", url, data=payload, headers=projectHeaders)\n        print(response.text)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Response Status Code = \" + str(response.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n    return;\n\ndef main(argv):\n\n    projectName = ''\n    projectVersion = ''\n\n    try:\n        opts, args = getopt.getopt(argv, \"hn:v:d\", [\"help\", \"projectName=\", \"projectVersion=\"])\n    except getopt.GetoptError:\n        print ('ssc-client.py -n &lt;projectName> -v &lt;projectVersion>')\n        sys.exit(2)\n    for opt, arg in opts:\n        if opt == '-h':\n            print ('ssc-client.py -n &lt;projectName> -v &lt;projectVersion>')\n            sys.exit()\n        elif opt in (\"-n\", \"--projectName\"):\n            projectName = arg\n        elif opt in (\"-v\", \"--projectVersion\"):\n            projectVersion = arg\n    print (\"\\nProject Name entered is: \" + projectName)\n    print (\"\\nProject Version entered is: \" + projectVersion)\n    print (\"\\nPerforming Initial Authentication.................................\")\n    print (\"\\nConnecting to \" + authURL + \"\\n\")\n\n    try:\n        authResponse = requests.request(\"POST\", authURL, headers=authHeaders)\n    except requests.exceptions.RequestException as e:\n        print (e)\n        print (\"-------------------------------------- \\n\")\n        print (\"Auth Response Status Code = \" + str(authResponse.status_code) + \"\\n\")\n        print (\"-------------------------------------- \\n\")\n        sys.exit(1)\n\n    if authResponse.status_code == 200 :\n\n        authJSON = authResponse.json()\n        data = authJSON['data']\n        sscToken = data['token']\n        print (\"SSC Token: \" + sscToken + \"\\n\")\n\n        projectHeaders = {\n            'accept': \"application\/json, text\/plain, *\/*\",\n            'cache-control': \"no-cache\",\n            'authorization': \"FortifyToken \"+sscToken,\n            'content-type': \"application\/json; charset=utf-8\",\n            'accept-encoding': \"gzip, deflate\",\n            }\n\n        #projectID = getProject( projectHeaders, projectName, projectVersion, projectURL )\n        getProject( projectHeaders, projectName, projectVersion, projectURL )\n\n    else :\n        print (\"Auth Request experienced an error and returned response code \" + str(authResponse.status_code) + \"\\n\")\n\nif __name__ == \"__main__\":\n    main(sys.argv[1:])<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[66],"tags":[],"class_list":["post-3386","post","type-post","status-publish","format-standard","hentry","category-computing_fortify"],"_links":{"self":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3386"}],"version-history":[{"count":0,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3386\/revisions"}],"wp:attachment":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}