Skip to content

Commit c5245fb

Browse files
committed
Removed requests python dependency in cf-bottom
Ticket: CFE-4188 Signed-off-by: Victor Moene <victor.moene@northern.tech>
1 parent ea5bc22 commit c5245fb

9 files changed

Lines changed: 110 additions & 79 deletions

File tree

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
requests==2.32.4

tom/changelog.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import re
22
import os
3-
import requests
43
import subprocess
54
import datetime
65
import hashlib
@@ -125,7 +124,7 @@ def generate_changelog_in_repo(self, branch, repo):
125124
return False
126125

127126
# find old and new versions
128-
(header, old_version, old_changelog) = self.split_changelog_into_parts(
127+
header, old_version, old_changelog = self.split_changelog_into_parts(
129128
changelog_filename, repo
130129
)
131130
if header != "":

tom/dependencies.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import re
22
import json
3-
import requests
43
import collections
54
import datetime
65
import hashlib
@@ -134,19 +133,23 @@ def checkfile(self, url, sha256=False):
134133
True, False, or sha256 of a linked file
135134
"""
136135
log.debug("checking URL: " + url)
136+
137+
is_head = not sha256 and url.startswith("http")
138+
method = "HEAD" if is_head else "GET"
137139
try:
138-
if not sha256 and url.startswith("http"):
139-
log.debug("testing with HEAD")
140-
r = requests.head(url)
141-
return r.status_code >= 200 and r.status_code < 300
142-
else:
140+
req = urllib.request.Request(url, method=method)
141+
with urllib.request.urlopen(req) as f:
142+
if is_head:
143+
log.debug("testing with HEAD")
144+
return True
145+
143146
log.debug("getting whole file")
144147
m = hashlib.sha256()
145-
with urllib.request.urlopen(url) as f:
148+
149+
data = f.read(4096)
150+
while data:
151+
m.update(data)
146152
data = f.read(4096)
147-
while data:
148-
m.update(data)
149-
data = f.read(4096)
150153
return m.hexdigest()
151154
except:
152155
return False
@@ -222,7 +225,8 @@ def get_version_from_monitoring(self, dep):
222225
id = self.monitoring_ids[dep]
223226
url = "https://release-monitoring.org/api/v2/versions/?project_id={}".format(id)
224227
try:
225-
data = requests.get(url).json()
228+
with urllib.request.urlopen(url) as r:
229+
data = json.loads(r)
226230
except:
227231
raise ReleaseMonitoringException(
228232
"Failed to do a request to release-monitoring.org website"
@@ -255,7 +259,7 @@ def get_current_version(self, dep):
255259
dist_file = self.buildscripts.get_file(dist_file_path)
256260
dist_file = dist_file.strip()
257261
old_filename = re.sub(".* ", "", dist_file)
258-
(old_version, separator) = self.extract_version_from_filename(dep, old_filename)
262+
old_version, separator = self.extract_version_from_filename(dep, old_filename)
259263
return old_version
260264

261265
def patch_spec_file(self, spec_file_path, old_version, new_version):
@@ -283,7 +287,7 @@ def update_single_dep(self, dep):
283287
source_file = source_file.strip()
284288
old_filename = re.sub(".* ", "", dist_file)
285289
old_url = "{}{}".format(source_file, old_filename)
286-
(old_version, separator) = self.extract_version_from_filename(dep, old_filename)
290+
old_version, separator = self.extract_version_from_filename(dep, old_filename)
287291
new_version = self.get_version_from_monitoring(dep)
288292
if not new_version:
289293
log.warning(

tom/github.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import random
2-
import requests
32
import re
43
import os
54
import sys
65
import json
76
import datetime
7+
import urllib.error
8+
import urllib.request
89
import logging as log
9-
import requests
1010
from copy import copy
1111

1212
from tom.utils import pretty, write_json
@@ -36,15 +36,16 @@ def get(self, path):
3636
if path in self.get_cache:
3737
log.debug("Found in cache")
3838
return self.get_cache[path]
39-
r = requests.get(path, headers=self.headers)
40-
log.debug("RESPONSE {}".format(r.status_code))
4139

42-
if not (200 <= r.status_code < 300):
43-
sys.exit("Non-success API response {} for '{}'".format(r.status_code, path))
40+
req = urllib.request.Request(path, headers=self.headers)
41+
try:
42+
with urllib.request.urlopen(req) as r:
43+
data = json.load(r)
44+
log.debug("RESPONSE {}".format(r.code))
45+
except urllib.error.HTTPError as e:
46+
sys.exit("Non-success API response {} for '{}'".format(e.code, path))
4447

45-
assert r.status_code >= 200 and r.status_code < 300
46-
data = r.json()
47-
log.debug(pretty(data))
48+
log.debug(json.dumps(data))
4849
self.get_cache[path] = data
4950
if (
5051
not isinstance(data, list)
@@ -74,12 +75,19 @@ def post(self, path, data, check_status_code=True):
7475
return None
7576
self.api_log("POST {} {}".format(path, data))
7677
path = self.path(path)
77-
r = requests.post(path, headers=self.headers, json=data)
78-
log.debug("RESPONSE {}".format(r.status_code))
79-
if check_status_code:
80-
assert r.status_code >= 200 and r.status_code < 300, r.text
81-
data = r.json()
82-
log.debug(pretty(data))
78+
79+
json_data = json.dumps(data).encode("utf-8")
80+
req = urllib.request.Request(path, headers=self.headers, data=json_data)
81+
try:
82+
with urllib.request.urlopen(req) as r:
83+
log.debug("RESPONSE {}".format(r.status_code))
84+
data = json.load(r)
85+
log.debug(r.read().decode())
86+
except urllib.error.HTTPError as e:
87+
log.error(e.headers)
88+
log.error(e.read().decode())
89+
raise AssertionError("HTTP response {} from GitHub".format(e.code))
90+
8391
return data
8492

8593
def create_pr(
@@ -388,7 +396,7 @@ def create_prs_from_slack(self):
388396
last_branch = self.find_last_branch_in_repo(username, repo)
389397
log.info("last branch: " + last_branch)
390398
# now, try to find a parent for it.
391-
(parent_repo, parent_branch) = self.find_parent(username, repo, last_branch)
399+
parent_repo, parent_branch = self.find_parent(username, repo, last_branch)
392400
log.info("parent branch: " + parent_branch)
393401
pr_text = self.github.create_pr(
394402
parent_repo, parent_branch, username, last_branch, last_branch + " PR", ""

tom/jenkins.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import logging as log
22
from time import sleep
3-
import requests
4-
from requests.auth import HTTPBasicAuth
53
from tom.utils import pretty
64
import os
5+
import base64
6+
import json
77
from typing import Dict
88

9+
import urllib.request
10+
import urllib.error
11+
912

1013
class Jenkins:
1114
def __init__(self, url, job, secrets, username):
@@ -20,7 +23,7 @@ def __init__(self, url, job, secrets, username):
2023
self.crumb = crumb
2124
self.username = username
2225

23-
self.auth = HTTPBasicAuth(user, token)
26+
self.auth = base64.b64encode(("%s:%s" % (user, token)).encode()).decode()
2427

2528
self.headers = {}
2629
if crumb:
@@ -34,17 +37,20 @@ def post(self, path, data):
3437
if os.getenv("TOM") == "PASSIVE":
3538
print("Would post: " + path)
3639
return None
37-
r = requests.post(path, data=data, headers=self.headers, auth=self.auth)
38-
if not (200 <= r.status_code < 300):
39-
log.error("Unexpected HTTP response from Jenkins: {}".format(r.status_code))
40-
log.error(str(r.headers))
41-
log.error(str(r.text))
42-
raise AssertionError("HTTP response {} from Jenkins".format(r.status_code))
43-
40+
json_data = json.dumps(data).encode("utf-8")
41+
req = urllib.request.Request(path, data=json_data, headers=self.headers)
42+
req.add_header("Authorization", "Basic %s" % self.auth)
4443
try:
45-
return r.headers, r.json()
46-
except:
47-
return r.headers, r.text
44+
with urllib.request.urlopen(req) as r:
45+
try:
46+
parsed = json.load(r)
47+
return r.headers, parsed
48+
except:
49+
return r.headers, r.read().decode()
50+
except urllib.error.HTTPError as e:
51+
log.error(e.headers)
52+
log.error(e.read().decode())
53+
raise AssertionError("HTTP response {} from Jenkins".format(e.code))
4854

4955
def trigger(
5056
self,
@@ -144,9 +150,16 @@ def wait_for_queue(self, url):
144150
while "executable" not in queue_item:
145151
log.info("Waiting for jenkins build in queue")
146152
sleep(1)
147-
r = requests.get(url + "api/json", headers=self.headers, auth=self.auth)
148-
assert r.status_code >= 200 and r.status_code < 300
149-
queue_item = r.json()
153+
req = urllib.request.Request("{}api/json".format(url), headers=self.headers)
154+
req.add_header("Authorization", "Basic %s" % self.auth)
155+
try:
156+
with urllib.request.urlopen(req) as r:
157+
queue_item = json.load(r)
158+
except urllib.error.HTTPError as e:
159+
log.error("Unexpected HTTP response from Jenkins: {}".format(e.code))
160+
log.error(e.headers)
161+
log.error(e.read().decode())
162+
raise AssertionError("HTTP response {} from Jenkins".format(e.code))
150163
log.debug(pretty(queue_item))
151164

152165
num = queue_item["executable"]["number"]

tom/packages.py

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import re
22
import json
3-
import requests
43
import collections
54
import datetime
5+
import urllib.request
6+
import urllib.error
67
from tom.git import GitRepo
78

89

@@ -51,6 +52,18 @@ def is_branch_or_version(string):
5152
return None
5253

5354

55+
def fetch_json(url):
56+
try:
57+
with urllib.request.urlopen(url) as r:
58+
return json.load(r)
59+
except urllib.error.HTTPError as e:
60+
raise URLDownloadFailureException(
61+
"failed to download %s, return code %d" % (url, e.code)
62+
)
63+
except json.decoder.JSONDecodeError as e:
64+
raise JSONParsingError("file %s is not a valid JSON" % url) from e
65+
66+
5467
class PackageMapper:
5568
"""Class responsible for updating packages_mapping.json file
5669
Currently it's tailored for cfengine needs.
@@ -125,18 +138,8 @@ def run(self, inputs):
125138
releases_url = (
126139
"https://cfengine.com/release-data/%s/releases.json" % product
127140
)
128-
releases_request = requests.get(releases_url)
129-
if not releases_request.ok:
130-
raise URLDownloadFailureException(
131-
"failed to download %s, return code %d"
132-
% (releases_url, releases_request.status_code)
133-
)
134-
try:
135-
releases_data = releases_request.json()
136-
except json.decoder.JSONDecodeError as e:
137-
raise JSONParsingError(
138-
"file %s is not a valid JSON" % releases_url
139-
) from e
141+
releases_data = fetch_json(releases_url)
142+
140143
if "releases" not in releases_data:
141144
raise JSONStructureError('no "releases" in %s JSON' % releases_url)
142145
if value_type == "version":
@@ -233,16 +236,7 @@ def run(self, inputs):
233236

234237
def collect_packages(self, url):
235238
"""Given a release URL, returns a dict where keys are platform names, and values are {'url': 'http...'}"""
236-
release_request = requests.get(url)
237-
if not release_request.ok:
238-
raise URLDownloadFailureException(
239-
"failed to download %s, return code %d"
240-
% (url, release_request.status_code)
241-
)
242-
try:
243-
release_data = release_request.json()
244-
except json.decoder.JSONDecodeError as e:
245-
raise JSONParsingError("file %s is not a valid JSON" % url) from e
239+
release_data = fetch_json(url)
246240
if "artifacts" not in release_data:
247241
raise JSONStructureError('no "artifacts" in %s JSON' % url)
248242
# release_data['artifacts'] is a dictionary (called 'table'), each element is a list

tom/slack.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import re
44
import sys
55
import json
6-
import requests
76
import logging as log
7+
import urllib.request
8+
import urllib.error
89
from tom.utils import pretty
910

1011

@@ -36,13 +37,25 @@ def post(self, url, data={}):
3637
url = self.api(url)
3738
if not "token" in data:
3839
data["token"] = self.bot_token
39-
r = requests.post(url, data)
40-
assert r.status_code >= 200 and r.status_code < 300
40+
41+
json_data = json.dumps(data).encode("utf-8")
42+
req = urllib.request.Request(
43+
url,
44+
data=json_data,
45+
method="POST",
46+
headers={"Content-Type": "application/json"},
47+
)
4148
try:
42-
log.debug(pretty(r.json()))
43-
return r.json()
44-
except:
45-
log.debug(pretty(r.text))
49+
with urllib.request.urlopen(req) as r:
50+
try:
51+
parsed = json.load(r)
52+
log.debug(r.read().decode())
53+
return parsed
54+
except json.JSONDecodeError:
55+
log.debug(r.read().decode())
56+
return False
57+
58+
except urllib.error.HTTPError:
4659
return False
4760

4861
def send_message(self, channel, text):

tom/tag.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import re
22
import os
3-
import requests
43
import subprocess
54
import datetime
65
import hashlib

tom/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import sys
22
import json
33
import hashlib
4+
import urllib.request
5+
import urllib.error
46

57

68
def read_json(path):

0 commit comments

Comments
 (0)