Skip to content

Commit be868bb

Browse files
authored
Merge pull request #246 from blackducksoftware/eriktest
Eriktest
2 parents d2d7f32 + a324175 commit be868bb

File tree

1 file changed

+114
-84
lines changed

1 file changed

+114
-84
lines changed

examples/client/update_project_with_component_licenses.py

Lines changed: 114 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,82 @@
2626

2727
from pprint import pprint
2828
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)
30105

31106
def 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+
132162
if __name__ == "__main__":
133163
sys.exit(main())

0 commit comments

Comments
 (0)