27
27
from pprint import pprint
28
28
from blackduck import Client
29
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
+
30
82
def getprojects (project_name ):
83
+ #Returns all Projects for a given Project Name
31
84
params = {
32
85
'q' : [f"name:{ project_name } " ]
33
86
}
34
87
projects = [p for p in bd .get_resource ('projects' , params = params ) if p ['name' ] == project_name ]
35
88
return projects
36
89
37
90
def getversions (project , version_name ):
91
+ #Returns all Versions from a Project with given Version Name
38
92
params = {
39
93
'q' : [f"versionName:{ version_name } " ]
40
94
}
41
95
versions = [v for v in bd .get_resource ('versions' , project , params = params ) if v ['versionName' ] == version_name ]
42
96
return versions
43
97
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 )
82
105
83
106
def parse_command_args ():
84
107
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():
89
112
parser .add_argument ("-v" , "--version_name" ). help = "Provide Project Version here"
90
113
return parser .parse_args ()
91
114
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 ):
104
116
#Validating only 1 Project
105
117
projects = getprojects (args .project_name )
106
118
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):
112
124
version = versions [0 ]
113
125
114
126
#Return only sub-projects, not components
115
- components = getsubprojects (version )
127
+ components = getcomponents (version , "Version" )
116
128
117
129
for subproject in components :
130
+ #Setting URL for API call
118
131
url = subproject ['_meta' ]['href' ]
132
+ #Retrieve Licenses
119
133
subprojectlicenses = getlicensesfromprojectversion (subproject )
134
+ #Defaulting licenseblock to correct format
120
135
licenseblock = [
121
136
{
122
137
"licenseType" : "CONJUNCTIVE" ,
123
138
"licenses" : subproject ['licenses' ][0 ]['licenses' ]}]
139
+ #Adding each license to array
124
140
for license in subprojectlicenses :
125
141
licenseblock [0 ]['licenses' ].append (license )
142
+ #Adding licenses to JSON body
126
143
subproject ['licenses' ]= licenseblock
127
- #pprint(subproject)
128
144
r = bd .session .put (url ,json = subproject )
129
145
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
131
156
132
157
if __name__ == "__main__" :
133
158
sys .exit (main ())
0 commit comments