Skip to content

Commit 327a7ff

Browse files
Merge pull request #18 from interlynk-io/fix/upload-error-display
Look for errors in the correct location
2 parents 910eb0e + b39217d commit 327a7ff

File tree

1 file changed

+38
-31
lines changed

1 file changed

+38
-31
lines changed

lynkctx.py

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
}
7373
"""
7474

75+
7576
class LynkContext:
7677
def __init__(self, api_url, token, prod_id, prod, env_id, env, ver_id, ver):
7778
self.api_url = api_url or INTERLYNK_API_URL
@@ -91,20 +92,20 @@ def validate(self):
9192
self.data = self._fetch_context()
9293
if not self.data or self.data.get('errors'):
9394
print("Error getting Interlynk data")
94-
print("Possible problems: invalid security token, stale pylynk or invalid INTERLYNK_API_URL")
95+
print(
96+
"Possible problems: invalid security token, stale pylynk or invalid INTERLYNK_API_URL")
9597
return False
9698

9799
if (self.prod or self.prod_id) and not self.resolve_prod():
98100
self.prod = self.prod_id = None
99101
print('Product not found')
100102
return False
101103

102-
if self.prod and not self.resolve_env(): # There must be a default env
104+
if self.prod and not self.resolve_env(): # There must be a default env
103105
self.env = self.env_id = None
104106
print('Environment not found')
105107
return False
106108

107-
108109
if (self.ver or self.ver_id) and not self.resolve_ver():
109110
self.ver = self.ver_id = None
110111
print('Version not found')
@@ -132,11 +133,15 @@ def _fetch_context(self):
132133

133134
def resolve_prod(self):
134135
if not self.prod_id:
135-
nodes = self.data.get('data', {}).get('organization', {}).get('productNodes', {}).get('products', [])
136-
self.prod_id = next((node['id'] for node in nodes if node['name'] == self.prod), None)
136+
nodes = self.data.get('data', {}).get('organization', {}).get(
137+
'productNodes', {}).get('products', [])
138+
self.prod_id = next(
139+
(node['id'] for node in nodes if node['name'] == self.prod), None)
137140
if not self.prod:
138-
nodes = self.data.get('data', {}).get('organization', {}).get('productNodes', {}).get('products', [])
139-
self.prod = next((node['name'] for node in nodes if node['id'] == self.prod_id), None)
141+
nodes = self.data.get('data', {}).get('organization', {}).get(
142+
'productNodes', {}).get('products', [])
143+
self.prod = next(
144+
(node['name'] for node in nodes if node['id'] == self.prod_id), None)
140145
return self.prod and self.prod_id
141146

142147
def resolve_env(self):
@@ -150,7 +155,7 @@ def resolve_env(self):
150155
for product in self.data.get('data', {}).get('organization', {}).get('productNodes', {}).get('products', []):
151156
if product['id'] == self.prod_id:
152157
self.env = next((env_node['id'] for env_node in product.get('environments', [])
153-
if env_node.get('id') == self.env_id), None)
158+
if env_node.get('id') == self.env_id), None)
154159
return self.env and self.env_id
155160

156161
def resolve_ver(self):
@@ -160,17 +165,17 @@ def resolve_ver(self):
160165
if product['id'] == self.prod_id:
161166
for env in product['environments']:
162167
if env['id'] == self.env_id:
163-
for ver in env['versions']:
164-
if ver['primaryComponent']['version'] == self.ver:
165-
self.ver_id = ver['id']
168+
for ver in env['versions']:
169+
if ver['primaryComponent']['version'] == self.ver:
170+
self.ver_id = ver['id']
166171
if not self.ver:
167172
for product in self.data.get('data', {}).get('organization', {}).get('productNodes', {}).get('products', []):
168173
if product['id'] == self.prod_id:
169174
for env in product['environments']:
170175
if env['id'] == self.env_id:
171-
for ver in env['versions']:
172-
if ver['id'] == self.ver_id:
173-
self.ver = ver['primaryComponent']['version']
176+
for ver in env['versions']:
177+
if ver['id'] == self.ver_id:
178+
self.ver = ver['primaryComponent']['version']
174179
return self.ver and self.ver_id
175180

176181
def __repr__(self):
@@ -189,7 +194,8 @@ def prods(self):
189194
prod_nodes = self.data['data']['organization']['productNodes']['products']
190195
prod_list = []
191196
for prod in prod_nodes:
192-
versions = sum(len(env['versions']) for env in prod['environments'])
197+
versions = sum(len(env['versions'])
198+
for env in prod['environments'])
193199
prod_list.append({
194200
'name': prod['name'],
195201
'updatedAt': prod['updatedAt'],
@@ -206,7 +212,7 @@ def versions(self):
206212

207213
def download(self):
208214
logging.debug("Downloading SBOM for environment ID %s, sbom ID %s",
209-
self.env_id, self.ver_id)
215+
self.env_id, self.ver_id)
210216

211217
variables = {
212218
"envId": self.env_id,
@@ -220,9 +226,10 @@ def download(self):
220226
}
221227

222228
response = requests.post(self.api_url,
223-
headers={"Authorization": "Bearer " + self.token},
224-
json=request_data,
225-
timeout=INTERLYNK_API_TIMEOUT)
229+
headers={
230+
"Authorization": "Bearer " + self.token},
231+
json=request_data,
232+
timeout=INTERLYNK_API_TIMEOUT)
226233

227234
if response.status_code == 200:
228235
try:
@@ -246,7 +253,7 @@ def download(self):
246253
logging.error("Failed to parse JSON response.")
247254
else:
248255
logging.error("Failed to send GraphQL request. Status code: %s",
249-
response.status_code)
256+
response.status_code)
250257

251258
def upload(self, sbom_file):
252259
if os.path.isfile(sbom_file) is False:
@@ -264,31 +271,32 @@ def upload(self, sbom_file):
264271
logging.debug("Uploading SBOM to product ID %s", self.prod_id)
265272

266273
headers = {
267-
"Authorization": "Bearer " + self.token
274+
"Authorization": "Bearer " + self.token
268275
}
269276

270277
operations = json.dumps({
271-
"query": QUERY_SBOM_UPLOAD,
272-
"variables": {"doc": None, "projectId": self.env_id}
278+
"query": QUERY_SBOM_UPLOAD,
279+
"variables": {"doc": None, "projectId": self.env_id}
273280
})
274281
map_data = json.dumps({"0": ["variables.doc"]})
275282

276283
form_data = {
277-
"operations": operations,
278-
"map": map_data
284+
"operations": operations,
285+
"map": map_data
279286
}
280287

281288
try:
282289
with open(sbom_file, 'rb') as sbom:
283290
files_map = {'0': sbom}
284291
response = requests.post(self.api_url,
285-
headers=headers,
286-
data=form_data,
287-
files=files_map,
288-
timeout=INTERLYNK_API_TIMEOUT)
292+
headers=headers,
293+
data=form_data,
294+
files=files_map,
295+
timeout=INTERLYNK_API_TIMEOUT)
289296
if response.status_code == 200:
290297
resp_json = response.json()
291-
errors = resp_json.get('errors')
298+
errors = resp_json.get('data', {}).get(
299+
'sbomUpload', {}).get('errors')
292300
if errors is not None and errors != '[]':
293301
print(f"Error uploading sbom: {errors}")
294302
return 1
@@ -301,4 +309,3 @@ def upload(self, sbom_file):
301309
except FileNotFoundError as ex:
302310
logging.error("FileNotFoundError: %s", ex)
303311
return 1
304-

0 commit comments

Comments
 (0)