2727from pprint import pprint
2828from blackduck import Client
2929
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+
3082def getprojects (project_name ):
83+ #Returns all Projects for a given Project Name
3184 params = {
3285 'q' : [f"name:{ project_name } " ]
3386 }
3487 projects = [p for p in bd .get_resource ('projects' , params = params ) if p ['name' ] == project_name ]
3588 return projects
3689
3790def getversions (project , version_name ):
91+ #Returns all Versions from a Project with given Version Name
3892 params = {
3993 'q' : [f"versionName:{ version_name } " ]
4094 }
4195 versions = [v for v in bd .get_resource ('versions' , project , params = params ) if v ['versionName' ] == version_name ]
4296 return versions
4397
44- def returnsubprojecturl (x ):
45- xurl = x ['_meta' ]['href' ]
46- x = xurl .split ("/" )
47- del x [5 ]
48- del x [5 ]
49- del x [5 ]
50- del x [5 ]
51- xurl = "/" .join (x )
52- return xurl
53-
54- def getsubprojects (version ):
55- subcomponents = [ subcomponents for subcomponents in bd .get_resource ('components' ,version ) if subcomponents ['componentType' ] == "SUB_PROJECT" ]
56- return subcomponents
57-
58- def checkforsubprojects (subproject ):
59- subprojecturl = returnsubprojecturl (subproject )
60- version = bd .session .get (subprojecturl ).json ()
61- subcomponents = [ subcomponents for subcomponents in bd .get_resource ('components' ,version ) if subcomponents ['componentType' ] == "SUB_PROJECT" ]
62- if len (subcomponents )> 0 :
63- check = True
64- else :
65- check = False
66- return check
67-
68- def getlicensesfromprojectversion (subproject ):
69- subprojecturl = returnsubprojecturl (subproject )
70- version = bd .session .get (subprojecturl ).json ()
71- components = bd .get_resource ('components' ,version )
72- licenselist = []
73- for component in components :
74- for license in 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-
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 )
82105
83106def parse_command_args ():
84107 parser = argparse .ArgumentParser ("update_project_with_component_licenses.py [-h] -u BASE_URL -t TOKEN_FILE [-nv] " )
@@ -89,18 +112,7 @@ def parse_command_args():
89112 parser .add_argument ("-v" , "--version_name" ). help = "Provide Project Version here"
90113 return parser .parse_args ()
91114
92- def main ():
93- args = parse_command_args ()
94- with open (args .token_file , 'r' ) as tf :
95- access_token = tf .readline ().strip ()
96- global bd
97- bd = Client (base_url = args .base_url , token = access_token , verify = args .no_verify , timeout = 60.0 , retries = 4 )
98- process_project_version (args .project_name , args .version_name , args )
99-
100- def process_children (children ):
101- sys .exit ()
102-
103- def process_project_version (project_name , version_name , args ):
115+ def process_project_version (args ):
104116 #Validating only 1 Project
105117 projects = getprojects (args .project_name )
106118 assert len (projects ) == 1 , f"There should be one, and only one project named { args .project_name } . We found { len (projects )} "
@@ -112,22 +124,35 @@ def process_project_version(project_name, version_name, args):
112124 version = versions [0 ]
113125
114126 #Return only sub-projects, not components
115- components = getsubprojects (version )
127+ components = getcomponents (version , "Version" )
116128
117129 for subproject in components :
130+ #Setting URL for API call
118131 url = subproject ['_meta' ]['href' ]
132+ #Retrieve Licenses
119133 subprojectlicenses = getlicensesfromprojectversion (subproject )
134+ #Defaulting licenseblock to correct format
120135 licenseblock = [
121136 {
122137 "licenseType" : "CONJUNCTIVE" ,
123138 "licenses" : subproject ['licenses' ][0 ]['licenses' ]}]
139+ #Adding each license to array
124140 for license in subprojectlicenses :
125141 licenseblock [0 ]['licenses' ].append (license )
142+ #Adding licenses to JSON body
126143 subproject ['licenses' ]= licenseblock
127- #pprint(subproject)
128144 r = bd .session .put (url ,json = subproject )
129145 print (r )
130-
146+
147+ def returnsubprojecturl (x ):
148+ xurl = x ['_meta' ]['href' ]
149+ x = xurl .split ("/" )
150+ del x [5 ]
151+ del x [5 ]
152+ del x [5 ]
153+ del x [5 ]
154+ xurl = "/" .join (x )
155+ return xurl
131156
132157if __name__ == "__main__" :
133158 sys .exit (main ())
0 commit comments