26
26
27
27
from pprint import pprint
28
28
from 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 )
30
105
31
106
def parse_command_args ():
32
107
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():
37
112
parser .add_argument ("-v" , "--version_name" ). help = "Provide Project Version here"
38
113
return parser .parse_args ()
39
114
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 ):
49
116
#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 )
54
118
assert len (projects ) == 1 , f"There should be one, and only one project named { args .project_name } . We found { len (projects )} "
55
119
project = projects [0 ]
56
120
57
121
#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 )
62
123
assert len (versions ) == 1 , f"There should be one, and only one version named { args .version_name } . We found { len (versions )} "
63
124
version = versions [0 ]
64
125
65
-
66
-
126
+ pprint ("Currently processing SubProjectes of Project " + project ['name' ] + " version " + version ['versionName' ])
67
127
#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
+
132
162
if __name__ == "__main__" :
133
163
sys .exit (main ())
0 commit comments