Skip to content

Commit 06ec066

Browse files
committed
Added subproject recursion
1 parent 09ab4af commit 06ec066

File tree

1 file changed

+78
-53
lines changed

1 file changed

+78
-53
lines changed

examples/client/update_project_with_component_licenses.py

Lines changed: 78 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -27,58 +27,81 @@
2727
from pprint import pprint
2828
from 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+
3082
def 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

3790
def 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

83106
def 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

132157
if __name__ == "__main__":
133158
sys.exit(main())

0 commit comments

Comments
 (0)