Skip to content

Commit

Permalink
[redhat|policy] Check for archive size before upload
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
jcastill authored and TurboTurtle committed May 16, 2024
1 parent bfdabff commit 11879fb
Showing 1 changed file with 23 additions and 6 deletions.
29 changes: 23 additions & 6 deletions sos/policies/distros/redhat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -429,16 +431,31 @@ def upload_sftp(self): # pylint: disable=too-many-branches
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
uploaded = super().upload_archive(archive)
if self.get_upload_url().startswith(RH_API_HOST):
self.upload_url = self.check_file_too_big(archive)
uploaded = super(RHELPolicy, self).upload_archive(archive)
except Exception as e:
uploaded = False
if not self.upload_url.startswith(RH_API_HOST):
Expand Down

0 comments on commit 11879fb

Please sign in to comment.