2626
2727from pprint import pprint
2828from blackduck import Client
29- from collections import defaultdict
29+
30+ licenselist = []
31+
32+ def checkforsubprojects (s ):
33+ #Simple Check to see if subproject also has child subprojects
34+ subcomponents = getcomponents (s ,"Sub" )
35+ if len (subcomponents )> 0 :
36+ check = True
37+ else :
38+ check = False
39+ return check
40+
41+ def getcomponents (spj , test ):
42+ #Returns Versions of a given project
43+ if test == "Version" :
44+ components = [ sp for sp in bd .get_resource ('components' ,spj ) if sp ['componentType' ] == "SUB_PROJECT" ]
45+ #Returns Subprojects for a given Project Version
46+ elif test == "Sub" :
47+ version = bd .session .get (returnsubprojecturl (spj )).json ()
48+ components = [ sp for sp in bd .get_resource ('components' ,version ) if sp ['componentType' ] == "SUB_PROJECT" ]
49+ #Returns license data for a given Project Version
50+ elif test == "License" :
51+ version = bd .session .get (returnsubprojecturl (spj )).json ()
52+ components = bd .get_resource ('components' ,version )
53+ return components
54+
55+ def getlicensesfromprojectversion (subproject ):
56+ license_components = getcomponents (subproject ,"License" )
57+ #check for subprojects
58+ if checkforsubprojects (subproject ) == True :
59+ #First Process Licenses of the components
60+ for license_component in license_components :
61+ for license in license_component ['licenses' ]:
62+ if license .get ("licenseType" ,None ) :
63+ for innerlicense in license ['licenses' ]:
64+ licenselist .append (innerlicense )
65+ else :
66+ licenselist .append (license )
67+ #Now Loop Through the nested projects
68+ loops = getcomponents (subproject ,"Sub" )
69+ for loop in loops :
70+ getlicensesfromprojectversion (loop )
71+ #When No SubProjects
72+ else :
73+ for license_component in license_components :
74+ for license in license_component ['licenses' ]:
75+ if license .get ("licenseType" ,None ):
76+ for innerlicense in license ['licenses' ]:
77+ licenselist .append (innerlicense )
78+ else :
79+ licenselist .append (license )
80+ return licenselist
81+
82+ def getprojects (project_name ):
83+ #Returns all Projects for a given Project Name
84+ params = {
85+ 'q' : [f"name:{ project_name } " ]
86+ }
87+ projects = [p for p in bd .get_resource ('projects' , params = params ) if p ['name' ] == project_name ]
88+ return projects
89+
90+ def getversions (project , version_name ):
91+ #Returns all Versions from a Project with given Version Name
92+ params = {
93+ 'q' : [f"versionName:{ version_name } " ]
94+ }
95+ versions = [v for v in bd .get_resource ('versions' , project , params = params ) if v ['versionName' ] == version_name ]
96+ return versions
97+
98+ def main ():
99+ args = parse_command_args ()
100+ with open (args .token_file , 'r' ) as tf :
101+ access_token = tf .readline ().strip ()
102+ global bd
103+ bd = Client (base_url = args .base_url , token = access_token , verify = args .no_verify , timeout = 60.0 , retries = 4 )
104+ process_project_version (args )
30105
31106def parse_command_args ():
32107 parser = argparse .ArgumentParser ("update_project_with_component_licenses.py [-h] -u BASE_URL -t TOKEN_FILE [-nv] " )
@@ -37,97 +112,52 @@ def parse_command_args():
37112 parser .add_argument ("-v" , "--version_name" ). help = "Provide Project Version here"
38113 return parser .parse_args ()
39114
40- def main ():
41- args = parse_command_args ()
42- with open (args .token_file , 'r' ) as tf :
43- access_token = tf .readline ().strip ()
44- global bd
45- bd = Client (base_url = args .base_url , token = access_token , verify = args .no_verify , timeout = 60.0 , retries = 4 )
46- process_project_version (args .project_name , args .version_name , args )
47-
48- def process_project_version (project_name , version_name , args ):
115+ def process_project_version (args ):
49116 #Validating only 1 Project
50- params = {
51- 'q' : [f"name:{ args .project_name } " ]
52- }
53- projects = [p for p in bd .get_resource ('projects' , params = params ) if p ['name' ] == args .project_name ]
117+ projects = getprojects (args .project_name )
54118 assert len (projects ) == 1 , f"There should be one, and only one project named { args .project_name } . We found { len (projects )} "
55119 project = projects [0 ]
56120
57121 #Validates only 1 Version
58- params = {
59- 'q' : [f"versionName:{ args .version_name } " ]
60- }
61- versions = [v for v in bd .get_resource ('versions' , project , params = params ) if v ['versionName' ] == args .version_name ]
122+ versions = getversions (project , args .version_name )
62123 assert len (versions ) == 1 , f"There should be one, and only one version named { args .version_name } . We found { len (versions )} "
63124 version = versions [0 ]
64125
65-
66-
126+ pprint ("Currently processing SubProjectes of Project " + project ['name' ] + " version " + version ['versionName' ])
67127 #Return only sub-projects, not components
68- components = (
69- c for c in bd .get_resource ('components' ,version ) if c ['componentType' ] == "SUB_PROJECT"
70- )
71- for components in components :
72- #JSON body
73- body = defaultdict (list )
74-
75- existing_licenses = []
76-
77- #Defining subcomponents
78- body ["componentName" ]= components ['componentName' ]
79- body ["componentVersionName" ]= components ['componentVersionName' ]
80- body ["component" ]= components ['component' ]
81- body ["componentVersion" ]= components ['componentVersion' ]
82- body ["componentType" ]= "SUB_PROJECT"
83- pprint (components ['componentName' ])
84- pprint (components ['componentVersionName' ])
85- url = components ['_meta' ]['href' ]
86- #Capture current License statement of components to add to
87- if len (components ['licenses' ][0 ]['licenses' ]) > 0 :
88- for i , v in enumerate (components ['licenses' ][0 ]['licenses' ]):
89- parent_license_display = components ['licenses' ][0 ]['licenses' ][i ]['licenseDisplay' ]
90- parent_license = components ['licenses' ][0 ]['licenses' ][i ]['license' ]
91- addlicense = {"licenseDisplay" :parent_license_display ,"license" : parent_license }
92- body ['licenses' ].append (addlicense )
93- if parent_license_display not in existing_licenses :
94- existing_licenses .append (parent_license_display )
95- else :
96- parent_license_display = components ['licenses' ][0 ]['licenses' ][0 ]['licenseDisplay' ]
97- parent_license = components ['licenses' ][0 ]['licenses' ][0 ]['license' ]
98- addlicense = {"licenseDisplay" :parent_license_display ,"license" : parent_license }
99- body ['licenses' ].append (addlicense )
100- if parent_license_display not in existing_licenses :
101- existing_licenses .append (parent_license_display )
102- #Retrieving componentName values
103- subprojects = [p for p in bd .get_resource ('projects' ) if p ['name' ] == components ['componentName' ]]
104- subproject = subprojects [0 ]
105- subversions = [v for v in bd .get_resource ('versions' , subproject ) if v ['versionName' ] == components ['componentVersionName' ]]
106- subversion = subversions [0 ]
107- for subcomponent in bd .get_resource ('components' ,subversion ):
108- #Parse through multiple licenses
109- if len (subcomponent ['licenses' ][0 ]['licenses' ]) > 0 :
110- for i , v in enumerate (subcomponent ['licenses' ][0 ]['licenses' ]):
111- child_license_display = subcomponent ['licenses' ][0 ]['licenses' ][i ]['licenseDisplay' ]
112- child_license = subcomponent ['licenses' ][0 ]['licenses' ][i ]['license' ]
113- addlicense = {"licenseDisplay" :child_license_display ,"license" : child_license }
114- if child_license_display not in existing_licenses :
115- body ['licenses' ].append (addlicense )
116- existing_licenses .append (child_license_display )
117- #When only one license return it
118- else :
119- child_license_display = subcomponent ['licenses' ][0 ]['licenseDisplay' ]
120- child_license = subcomponent ['licenses' ][0 ]['license' ]
121- addlicense = {"licenseDisplay" :child_license_display ,"license" : child_license }
122- if child_license_display not in existing_licenses :
123- body ['licenses' ].append (addlicense )
124- existing_licenses .append (child_license_display )
125- pprint (dict (body ))
126- try :
127- r = bd .session .put (url ,json = (dict (body )))
128- if r .status_code == 200 :
129- print ("updated project" )
130- except requests .HTTPError as err :
131- bd .http_error_handler (err )
128+ components = getcomponents (version , "Version" )
129+
130+ for subproject in components :
131+ #Setting URL for API call
132+ url = subproject ['_meta' ]['href' ]
133+ #Retrieve Licenses
134+ subprojectlicenses = getlicensesfromprojectversion (subproject )
135+ #Defaulting licenseblock to correct format
136+ licenseblock = [
137+ {
138+ "licenseType" : "CONJUNCTIVE" ,
139+ "licenses" : subproject ['licenses' ][0 ]['licenses' ]}]
140+ #Adding each license to array
141+ for license in subprojectlicenses :
142+ licenseblock [0 ]['licenses' ].append (license )
143+ #Adding licenses to JSON body
144+ subproject ['licenses' ]= licenseblock
145+ try :
146+ r = bd .session .put (url ,json = subproject )
147+ print ("Updated SubProject " + subproject ['componentName' ] + " with child licenses" )
148+ except KeyError as err :
149+ pprint (err )
150+
151+
152+ def returnsubprojecturl (x ):
153+ xurl = x ['_meta' ]['href' ]
154+ x = xurl .split ("/" )
155+ del x [5 ]
156+ del x [5 ]
157+ del x [5 ]
158+ del x [5 ]
159+ xurl = "/" .join (x )
160+ return xurl
161+
132162if __name__ == "__main__" :
133163 sys .exit (main ())
0 commit comments