Skip to content

Commit 391b030

Browse files
committed
Centralized execution results implemented
1 parent bcd8d56 commit 391b030

File tree

2 files changed

+61
-57
lines changed

2 files changed

+61
-57
lines changed

examples/client/multi-image/manage_project_structure.py

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ def init_project_data(self,args):
9191

9292
subprojects = dict()
9393
child_spec_list = self.get_child_spec_list(args)
94+
# pprint (child_spec_list)
9495
for child_spec in [x.split(':') for x in child_spec_list]:
9596
subproject = dict()
9697
i = iter(child_spec)
@@ -133,57 +134,57 @@ def remove_project_structure(self, project_name, version_name):
133134
project = self.find_project_by_name(project_name)
134135

135136
if not project:
136-
logging.info(f"Project {project_name} does not exist.")
137+
logging.debug(f"Project {project_name} does not exist.")
137138
return
138139
num_versions = self.client.get_resource('versions', project, items=False)['totalCount']
139140
version = self.find_project_version_by_name(project,version_name)
140141
if not version:
141-
logging.info(f"Project {project_name} with version {version_name} does not exist.")
142+
logging.debug(f"Project {project_name} with version {version_name} does not exist.")
142143
return
143144
components = [
144145
c for c in self.client.get_resource('components',version) if c['componentType'] == "SUB_PROJECT"
145146
]
146-
logging.info(f"Project {project_name}:{version_name} has {len(components)} subprojects")
147+
logging.debug(f"Project {project_name}:{version_name} has {len(components)} subprojects")
147148
for component in components:
148149
component_name = component['componentName']
149150
component_version_name = component['componentVersionName']
150-
logging.info(f"Removing subproject {component_name} from {project_name}:{version_name}")
151+
logging.debug(f"Removing subproject {component_name} from {project_name}:{version_name}")
151152
component_url = component['_meta']['href']
152153
response = self.client.session.delete(component_url)
153-
logging.info(f"Operation completed with {response}")
154+
logging.debug(f"Operation completed with {response}")
154155
self.remove_project_structure(component_name, component_version_name)
155-
logging.info(f"Removing {project_name}:{version_name}")
156+
logging.debug(f"Removing {project_name}:{version_name}")
156157
if num_versions > 1:
157158
response = self.client.session.delete(version['_meta']['href'])
158159
else:
159160
response = self.client.session.delete(project['_meta']['href'])
160-
logging.info(f"Operation completed with {response}")
161+
logging.debug(f"Operation completed with {response}")
161162

162-
def remove_codelocations_recursively(version):
163+
def remove_codelocations_recursively(self, version):
163164
components = self.client.get_resource('components', version)
164165
subprojects = [x for x in components if x['componentType'] == 'SUB_PROJECT']
165-
logging.info(f"Found {len(subprojects)} subprojects")
166-
unmap_all_codelocations(version)
166+
logging.debug(f"Found {len(subprojects)} subprojects")
167+
self.unmap_all_codelocations(version)
167168
for subproject in subprojects:
168169
subproject_name = subproject['componentName']
169170
subproject_version_name = subproject['componentVersionName']
170-
project = find_project_by_name(subproject_name)
171+
project = self.find_project_by_name(subproject_name)
171172
if not project:
172-
logging.info(f"Project {subproject_name} does not exist.")
173+
logging.debug(f"Project {subproject_name} does not exist.")
173174
return
174-
subproject_version = find_project_version_by_name(project, subproject_version_name)
175+
subproject_version = self.find_project_version_by_name(project, subproject_version_name)
175176
if not subproject_version:
176-
logging.info(f"Project {subproject_name} with version {subversion_name} does not exist.")
177+
logging.debug(f"Project {subproject_name} with version {subproject_version_name} does not exist.")
177178
return
178-
remove_codelocations_recursively(subproject_version)
179+
self.remove_codelocations_recursively(subproject_version)
179180

180-
def unmap_all_codelocations(version):
181+
def unmap_all_codelocations(self, version):
181182
codelocations = self.client.get_resource('codelocations',version)
182183
for codelocation in codelocations:
183-
logging.info(f"Unmapping codelocation {codelocation['name']}")
184+
logging.debug(f"Un-mapping of code location {codelocation['name']}")
184185
codelocation['mappedProjectVersion'] = ""
185186
response = self.client.session.put(codelocation['_meta']['href'], json=codelocation)
186-
pprint (response)
187+
logging.debug(f"Un-mapping of code location {codelocation['name']} completed with {response}")
187188

188189

189190
def find_or_create_project_group(self, group_name):
@@ -316,8 +317,7 @@ def create_and_add_child_projects(self,version):
316317
self.log('debug',f"Adding {child_name} : {version_name} to parent project completed with {response}", child)
317318
except Exception as e:
318319
self.log('debug',f"Adding {child_name} : {version_name} to parent project completed with exception {e}", child)
319-
320-
# remove_codelocations_recursively(version)
320+
self.remove_codelocations_recursively(version)
321321
else:
322322
response = self.create_project_version(child_name,version_name, nickname=container_spec)
323323
self.log('debug',f"Creating project {child_name} : {version_name} completed with {response}", child)
@@ -335,7 +335,7 @@ def create_and_add_child_projects(self,version):
335335
response = self.client.session.post(version_url,json={'component': child_version_url})
336336
self.log('debug',f"Adding {child_name} : {version_name} to parent project completed with {response}", child)
337337

338-
def create_project_structures(self):
338+
def create_project_structure(self):
339339
project_name = self.project_data['project_name']
340340
version_name = self.project_data['version_name']
341341

@@ -369,6 +369,21 @@ def create_project_structures(self):
369369
self.log('debug',f"Checking/Adding subprojects to {project_name} : {version['versionName']}", self.project_data)
370370
self.create_and_add_child_projects(version)
371371

372+
def validate_project_structure(self):
373+
parent_project = self.find_project_by_name(self.project_data['project_name'])
374+
parent_version = self.find_project_version_by_name(parent_project, self.project_data['version_name'])
375+
components = [c for c in self.client.get_resource('components', parent_version) if c['componentType'] == 'SUB_PROJECT']
376+
for spn, sp in self.project_data['subprojects'].items():
377+
spn = sp['project_name']
378+
spvn = sp['version_name']
379+
ca = [c for c in components if spn == c['componentName'] and spvn == c['componentVersionName']]
380+
if len(ca) == 1:
381+
sp['status'] = 'PRESENT'
382+
self.log('debug',f"Sub-project project {spn} : {spvn} is present in the BOM ", sp)
383+
else:
384+
sp['status'] = 'ABSENT'
385+
self.log('debug',f"Sub-project project {spn} : {spvn} could not be added to the BOM ", sp)
386+
372387
def scan_container_images(self):
373388
from scan_docker_image_lite import scan_container_image
374389
from blackduck.HubRestApi import HubInstance
@@ -388,7 +403,7 @@ def scan_container_images(self):
388403
if project_group:
389404
detect_options += f" --detect.project.group.name=\"{project_group}\""
390405
try:
391-
scan_container_image(
406+
results = scan_container_image(
392407
image_name,
393408
None,
394409
None,
@@ -399,6 +414,7 @@ def scan_container_images(self):
399414
hub=hub,
400415
binary=False
401416
)
417+
child['scan_results'] = results
402418
except Exception:
403419
import traceback
404420
traceback.print_exc()
@@ -410,7 +426,8 @@ def proceed(self):
410426
version_name = self.project_data['version_name']
411427
self.remove_project_structure(project_name, version_name)
412428
else:
413-
self.create_project_structures()
429+
self.create_project_structure()
430+
self.validate_project_structure()
414431
self.scan_container_images()
415432

416433

@@ -439,33 +456,7 @@ def main():
439456
mipm = MultiImageProjectManager(args)
440457
logging.info(f"Parsed {len(mipm.project_data['subprojects'])} projects from specification data")
441458
mipm.proceed()
442-
pprint(mipm.project_data)
443-
sys.exit(1)
444-
445-
log_config(args.debug)
446-
global scan_params, skipped_scans
447-
scan_params = []
448-
skipped_scans = []
449-
logging.debug(f"{args}")
450-
structure = define_project_structure(args)
451-
452-
if args.remove:
453-
remove_project_structure(args.project_name, args.version_name, structure)
454-
else:
455-
create_project_structure(structure)
456-
sys.exit(10)
457-
if args.dry_run:
458-
logging.info(f"{pformat(scan_params)}")
459-
else:
460-
logging.info("Now executing scans")
461-
from blackduck.HubRestApi import HubInstance
462-
hub = HubInstance(args.base_url, api_token=access_token, insecure=True, debug=False)
463-
scan_container_images(scan_params, hub)
464-
if len(skipped_scans) > 0:
465-
logging.info(f"The following images were not scanned")
466-
logging.info(f"{pformat(skipped_scans)}")
467-
468-
459+
469460

470461
if __name__ == "__main__":
471462
sys.exit(main())

examples/client/multi-image/scan_docker_image_lite.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,14 @@ def __init__(
253253

254254
def prepare_container_image(self):
255255
self.docker.initdir()
256-
self.docker.pull_container_image(self.container_image_name)
257-
self.docker.save_container_image(self.container_image_name)
258-
self.docker.unravel_container()
256+
result = self.docker.pull_container_image(self.container_image_name)
257+
logging.debug(f"Command {" ".join(result.args)} exited with returncode {result.returncode}")
258+
result = self.docker.save_container_image(self.container_image_name)
259+
if result.returncode:
260+
raise Exception (f"Command {" ".join(result.args)} failed with returncode {result.returncode} error = {result.stdout}")
261+
result = self.docker.unravel_container()
262+
if result.returncode:
263+
raise Exception (f"Command {" ".join(result.args)} failed with returncode {result.returncode} error = {result.stdout}")
259264
# result = self.docker.get_container_image_history(self.container_image_name)
260265
history = self.docker.read_config()['history']
261266
layer_count = 0
@@ -378,7 +383,7 @@ def get_group_name(self, groups, index):
378383
return group_name
379384

380385
def process_oci_container_image_by_base_image_info(self):
381-
print ("Processing by BAse Image not supported for OCI images")
386+
print ("Processing by Base Image not supported for OCI images")
382387
sys.exit(1)
383388
pass
384389

@@ -420,10 +425,16 @@ def submit_layer_scans(self):
420425
options.extend(self.adorn_extra_options(layer))
421426
else:
422427
options.extend(self.extra_options)
423-
logging.info(f"Submitting scan for {layer['name']}")
428+
logging.debug(f"Submitting scan for {layer['name']}")
424429
completed = self.hub_detect.detect_run(options)
425-
logging.info(f"Detect run for {layer['name']} completed with returncode {completed.returncode}")
426-
430+
scan_results = dict()
431+
for key, value in vars(completed).items():
432+
if type(value) is bytes:
433+
scan_results[key] = value.decode('utf-8')
434+
else:
435+
scan_results[key] = value
436+
layer['scan_results'] = scan_results
437+
logging.debug(f"Detect run for {layer['name']} completed with returncode {completed.returncode}")
427438

428439
def adorn_extra_options(self, layer):
429440
result = list()
@@ -494,9 +505,11 @@ def scan_container_image(
494505
scanner.base_layers = scanner.get_base_layers()
495506
if binary:
496507
scanner.binary = True
508+
logging.info(f"Scanning image {imagespec}")
497509
scanner.prepare_container_image()
498510
scanner.process_container_image()
499511
scanner.submit_layer_scans()
512+
return scanner.layers
500513

501514
def main(argv=None):
502515

0 commit comments

Comments
 (0)