Skip to content

Commit 8bcd57b

Browse files
author
Glenn Snyder
committed
2 parents c3d7c59 + 3662f46 commit 8bcd57b

File tree

1 file changed

+47
-33
lines changed

1 file changed

+47
-33
lines changed

examples/batch_policy_override.py

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@
3737
component_name = field 0 (Column A in Excel lingo)
3838
component_version = field 1 (Column B in Excel lingo)
3939
policy_violation_status = field 8 (Column I in Excel lingo)
40-
override_rationale = field 11 (Column L in Excel lingo)
41-
project_name = field 13 (Column N in Excel lingo)
42-
project_version = field 14 (Column O in Excel lingo)
40+
override_category = field 9 (Column J in Excel lingo)
41+
override_date = field 11 (Column L in Excel lingo)
42+
override_rationale = field 12 (Column M in Excel lingo)
43+
project_name = field 14 (Column O in Excel lingo)
44+
project_version = field 15 (Column P in Excel lingo)
4345
4446
Usage:
4547
@@ -65,14 +67,16 @@
6567
Component Policy Status (Column I) - NOT_IN_VIOLATION, IN_VIOLATION, IN_VIOLATION_OVERRIDEN
6668
as determined by BD (the script would only look for
6769
components that are shown as “IN_VIOLATION”)
68-
Override Rationale (Column L) - Alteryx will export whatever Override comment is already in BD.
70+
Policy Category (Column J) - If componet has multiple policy vialations only ovewrride
71+
those with this category
72+
Override Rationale (Column M) - Alteryx will export whatever Override comment is already in BD.
6973
For components IN_VIOLATION, this column will be used to work
7074
iteratively on the draft Override comment.
71-
project_name (Column N) - Project name used by the product team for the BD scan
72-
version_number (Column O) - Project version used by the product team for the BD scan
75+
project_name (Column O) - Project name used by the product team for the BD scan
76+
version_number (Column P) - Project version used by the product team for the BD scan
7377
7478
The script would parse the spreadsheet and for each component that has a status of “IN_VIOLATION”, it would:
75-
Upload the Override Rationale (Column L) into the Override Comment field for that component in BD (for that project name/version).
79+
Upload the Override Rationale (Column M) into the Override Comment field for that component in BD (for that project name/version).
7680
Update the Override Date to “now” (not sure of the best way to get the correct date-stamp).
7781
Update the Overridden Field with the name of the individual running the script (not sure of the best way to get the individual’s identity).
7882
Not sure if the Component Policy Status field needs to be updated to IN_VIOLATION_OVERRIDEN by the script or if BD will do it automatically once the Override Comment has been added.
@@ -81,6 +85,7 @@
8185
8286
'''
8387
import csv
88+
from posixpath import split
8489
import sys
8590
import argparse
8691
import json
@@ -92,13 +97,14 @@
9297
from datetime import timedelta
9398
from datetime import datetime
9499
from blackduck import Client
100+
from pprint import pprint
95101

96102
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', stream=sys.stderr, level=logging.DEBUG)
97103
logging.getLogger("requests").setLevel(logging.WARNING)
98104
logging.getLogger("urllib3").setLevel(logging.WARNING)
99105
logging.getLogger("blackduck").setLevel(logging.DEBUG)
100106

101-
def override_policy_violaton(project_name, project_version, component_name, component_version, override_rationale):
107+
def override_policy_violaton(project_name, project_version, component_name, component_version, override_rationale, override_category):
102108
params = {"q": f"name:{project_name}"}
103109
projects = bd.get_resource('projects', params=params)
104110
for project in projects:
@@ -110,20 +116,27 @@ def override_policy_violaton(project_name, project_version, component_name, comp
110116
components = bd.get_resource('components', version, params=params)
111117
for component in components:
112118
component_version_name = str(component['componentVersionName'])
119+
component_url = bd.list_resources(component)['href']
113120
if str(component_version_name).strip() == str(component_version).strip():
114121
logging.info(f"Overriding violation for {component_name} {component_version} in {project_name} {project_version}")
115122
policy_status = bd.get_resource('policy-status', component, items=False)
116-
url = bd.list_resources(policy_status)['href']
117-
data = {
118-
"approvalStatus" : "IN_VIOLATION_OVERRIDDEN",
119-
"comment" : f"{override_rationale}",
120-
"updatedAt" : datetime.now().isoformat()
121-
}
122-
headers = {"Content-Type": "application/vnd.blackducksoftware.bill-of-materials-6+json",
123-
"Accept": "application/vnd.blackducksoftware.bill-of-materials-6+json" }
124-
r = bd.session.put(url, headers = headers, json=data)
125-
# r.raise_for_status()
126-
logging.info(f"Policy status update completion code {r.status_code}")
123+
for item in policy_status['_meta']['links']:
124+
policy_url = item['href']
125+
policy_rule_id = policy_url.split("/")[5]
126+
policy_update_url = f"{component_url}/policy-rules/{policy_rule_id}/policy-status"
127+
policy_rule = bd.session.get(policy_url).json()
128+
policy_category = policy_rule['category']
129+
if override_category == policy_category:
130+
data = {
131+
"approvalStatus" : "IN_VIOLATION_OVERRIDDEN",
132+
"comment" : f"{override_rationale}",
133+
"updatedAt" : datetime.now().isoformat()
134+
}
135+
headers = {"Content-Type": "application/vnd.blackducksoftware.bill-of-materials-6+json",
136+
"Accept": "application/vnd.blackducksoftware.bill-of-materials-6+json" }
137+
r = bd.session.put(policy_update_url, headers = headers, json=data)
138+
r.raise_for_status()
139+
logging.info(f"Policy status update completion code {r.status_code}")
127140

128141

129142
def parse_command_args():
@@ -137,20 +150,21 @@ def parse_command_args():
137150
return parser.parse_args()
138151

139152
def process_csv_file(filename):
140-
file = open(args.input_file)
153+
file = open(filename)
141154
type(file)
142155
csvreader = csv.reader(file)
143156
for row in csvreader:
144157
component_name = row[0]
145158
component_version = row[1]
146159
policy_violation_status = row[8]
147-
override_date = row[10]
148-
override_rationale = row[11]
149-
project_name = row[13]
150-
project_version = row[14]
160+
override_category = row[9]
161+
override_date = row[11]
162+
override_rationale = row[12]
163+
project_name = row[14]
164+
project_version = row[15]
151165
if policy_violation_status == 'IN_VIOLATION' and override_rationale and not override_date:
152-
logging.info(f"Attemting to override policy status for {component_name} {component_version} in {project_name} {project_version} with ''{override_rationale}''")
153-
override_policy_violaton(project_name, project_version, component_name, component_version, override_rationale)
166+
logging.info(f"Processing category {override_category} {component_name} {component_version} in {project_name} {project_version} with ''{override_rationale}''")
167+
override_policy_violaton(project_name, project_version, component_name, component_version, override_rationale, override_category)
154168

155169
def process_excel_file(filename):
156170
import openpyxl
@@ -162,14 +176,14 @@ def process_excel_file(filename):
162176
component_name = row[0]
163177
component_version = row[1]
164178
policy_violation_status = row[8]
165-
override_date = row[10]
166-
override_rationale = row[11]
167-
project_name = row[13]
168-
project_version = row[14]
179+
override_category = row[9]
180+
override_date = row[11]
181+
override_rationale = row[12]
182+
project_name = row[14]
183+
project_version = row[15]
169184
if policy_violation_status == 'IN_VIOLATION' and override_rationale and not override_date:
170-
print ("overriding")
171-
logging.info(f"Processing for batch entry {component_name} {component_version} in {project_name} {project_version} with ''{override_rationale}''")
172-
override_policy_violaton(project_name, project_version, component_name, component_version, override_rationale)
185+
logging.info(f"Processing category {override_category} {component_name} {component_version} in {project_name} {project_version} with ''{override_rationale}''")
186+
override_policy_violaton(project_name, project_version, component_name, component_version, override_rationale, override_category)
173187
if not process:
174188
process = (row[0] == "Name of Software Component")
175189

0 commit comments

Comments
 (0)