78 lines
3.2 KiB
Diff
78 lines
3.2 KiB
Diff
From 11879fbb1adc33d8abc0cb70dc63e7e88c39fc3f Mon Sep 17 00:00:00 2001
|
|
From: Jose Castillo <jcastillo@redhat.com>
|
|
Date: Wed, 21 Feb 2024 12:24:37 +0000
|
|
Subject: [PATCH] [redhat|policy] Check for archive size before upload
|
|
|
|
The Red Hat Customer Portal has a max limit for
|
|
single http requests of 1Gb. From sos side, we never checked this
|
|
and so customers had to wait for the whole upload to be attempted
|
|
before receiving an error from the portal.
|
|
This patch attempts to stop the upload before it starts, informing
|
|
customers of such limit, and switching to secure FTP where there's
|
|
no limit.
|
|
|
|
Related: RHEL-22732
|
|
|
|
Signed-off-by: Jose Castillo <jcastillo@redhat.com>
|
|
---
|
|
sos/policies/distros/redhat.py | 29 +++++++++++++++++++++++------
|
|
1 file changed, 23 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/sos/policies/distros/redhat.py b/sos/policies/distros/redhat.py
|
|
index edea151e2..2fb0df3fa 100644
|
|
--- a/sos/policies/distros/redhat.py
|
|
+++ b/sos/policies/distros/redhat.py
|
|
@@ -22,7 +22,7 @@
|
|
from sos.policies.package_managers.rpm import RpmPackageManager
|
|
from sos.policies.package_managers.flatpak import FlatpakPackageManager
|
|
from sos.policies.package_managers import MultiPackageManager
|
|
-from sos.utilities import bold
|
|
+from sos.utilities import bold, convert_bytes
|
|
from sos import _sos as _
|
|
|
|
try:
|
|
@@ -232,6 +232,8 @@ class RHELPolicy(RedHatPolicy):
|
|
_upload_url = RH_SFTP_HOST
|
|
_upload_method = 'post'
|
|
_device_token = None
|
|
+ # Max size for an http single request is 1Gb
|
|
+ _max_size_request = 1073741824
|
|
|
|
def __init__(self, sysroot=None, init=None, probe_runtime=True,
|
|
remote_exec=None):
|
|
@@ -429,15 +429,30 @@ support representative.
|
|
return super().upload_sftp(user=_user, password=_token)
|
|
raise Exception("Could not retrieve valid or anonymous credentials")
|
|
|
|
+ def check_file_too_big(self, archive):
|
|
+ size = os.path.getsize(archive)
|
|
+ # Lets check if the size is bigger than the limit.
|
|
+ # There's really no need to transform the size to Gb,
|
|
+ # so we don't need to call any size converter implemented
|
|
+ # in tools.py
|
|
+ if (size >= self._max_size_request):
|
|
+ self.ui_log.warning(
|
|
+ _("Size of archive is bigger than Red Hat Customer Portal "
|
|
+ "limit for uploads of "
|
|
+ f"{convert_bytes(self._max_size_request)} "
|
|
+ " via sos http upload. \n")
|
|
+ )
|
|
+ return RH_SFTP_HOST
|
|
+ else:
|
|
+ return RH_API_HOST
|
|
+
|
|
def upload_archive(self, archive):
|
|
"""Override the base upload_archive to provide for automatic failover
|
|
from RHCP failures to the public RH dropbox
|
|
"""
|
|
try:
|
|
- if self.upload_url and self.upload_url.startswith(RH_API_HOST) and\
|
|
- (not self.get_upload_user() or
|
|
- not self.get_upload_password()):
|
|
- self.upload_url = RH_SFTP_HOST
|
|
+ if self.get_upload_url().startswith(RH_API_HOST):
|
|
+ self.upload_url = self.check_file_too_big(archive)
|
|
uploaded = super().upload_archive(archive)
|
|
except Exception as e:
|
|
uploaded = False
|