Open jcastill opened 1 month ago
Huge thanks to @pmoravec for all the help reviewing this, suggesting improvements, and finding bugs. This is a first implementation of the 'upload' component, that can help users to upload already created sos or other files that support organizations can find useful. In the future, the idea is to hook 'report' and 'collector' components to this one if the maintainers think is a good idea.
Congratulations! One of the builds has completed. :champagne:
You can install the built RPMs by following these steps:
sudo yum install -y dnf-plugins-core
on RHEL 8sudo dnf install -y dnf-plugins-core
on Fedoradnf copr enable packit/sosreport-sos-3746
Please note that the RPMs should be used only in a testing environment.
@arif-ali about these ones:
sos/upload/init.py:103:0: C0325: Unnecessary parens after '=' keyword (superfluous-parens) Fixed sos/upload/init.py:141:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) Fixed sos/upload/init.py:142:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) Fixed
***** Module sos.upload sos/upload/init.py:47:8: R1725: Consider using Python 3 style super() without arguments (super-with-arguments) Do I need to fix this one? Are we doing the same in the rest of the code, or is a nice-thing to have but not necessary?
sos/upload/init.py:42:46: W0613: Unused argument 'in_place' (unused-argument) This is there to help with hooking report and others in the future, but can remove it now.
sos/upload/init.py:43:17: W0613: Unused argument 'hook_commons' (unused-argument) Same as above as far as I know.
sos/upload/init.py:155:24: R1722: Consider using 'sys.exit' instead (consider-using-sys-exit) I'll make this change now.
With R1725, I made the changes a few months back, and hence enabled the check, so let's do this here too.
With the unused variable. If your 100% sure you're going to be using them then potentially you could add the following before the line
#pylint: disable=unused-argument
With R1725, I made the changes a few months back, and hence enabled the check, so let's do this here too.
Done, should be in the version I just pushed.
With the unused variable. If your 100% sure you're going to be using them then potentially you could add the following before the line
#pylint: disable=unused-argument
Nice one! But I ended up removing it. I'll re-add them in the future when I have ready the code for hooking report etc.
When I run:
python3 bin/sos upload /var/tmp/sosreport-pmoravec-rhel8-01234567-2024-08-13-gbiatgg.tar.xz
and "Press ENTER to continue", and then nothing, then I get a final error:
..
Attempting to upload file /var/tmp/sosreport-pmoravec-rhel8-01234567-2024-08-13-gbiatgg.tar.xz to case
No case id provided, uploading to SFTP
No case id provided, uploading to SFTP
Attempting upload to Red Hat Secure FTP
Please visit the following URL to authenticate this device: https://sso.redhat.com/device?user_code=SOME-CODE
User anonUser used for anonymous upload. Please inform your support engineer so they may retrieve the data.
Upload attempt failed: 'RHELPolicy' object has no attribute 'upload_directory'
I think the upload did not succeed at the end..
When pressing Ctrl+C on ress ENTER to continue, or CTRL-C to quit
prompt, I get backtrace:
Press ENTER to continue, or CTRL-C to quit
^CTraceback (most recent call last):
File "/root/sos-main/sos/upload/__init__.py", line 120, in intro
input(prompt)
KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "bin/sos", line 22, in <module>
sos.execute()
File "/root/sos-main/sos/__init__.py", line 187, in execute
self._component.execute()
File "/root/sos-main/sos/upload/__init__.py", line 137, in execute
self.intro()
File "/root/sos-main/sos/upload/__init__.py", line 123, in intro
self.exit("Exiting on user cancel", 130)
AttributeError: 'SoSUpload' object has no attribute 'exit'
@pmoravec thank you for finding this, I thought we solved these issues:
When I run:
python3 bin/sos upload /var/tmp/sosreport-pmoravec-rhel8-01234567-2024-08-13-gbiatgg.tar.xz
and "Press ENTER to continue", and then nothing, then I get a final error:
.. Attempting to upload file /var/tmp/sosreport-pmoravec-rhel8-01234567-2024-08-13-gbiatgg.tar.xz to case No case id provided, uploading to SFTP No case id provided, uploading to SFTP
I'll check the double messaging here, looks horrible.
Attempting upload to Red Hat Secure FTP Please visit the following URL to authenticate this device: https://sso.redhat.com/device?user_code=SOME-CODE User anonUser used for anonymous upload. Please inform your support engineer so they may retrieve the data. Upload attempt failed: 'RHELPolicy' object has no attribute 'upload_directory'
I'll check this one as well, I remember we had a similar issue with a previous implementation.
I think the upload did not succeed at the end..
No, it should not succeed in that case.
When pressing Ctrl+C on
ress ENTER to continue, or CTRL-C to quit
prompt, I get backtrace:Press ENTER to continue, or CTRL-C to quit ^CTraceback (most recent call last): File "/root/sos-main/sos/upload/__init__.py", line 120, in intro input(prompt) KeyboardInterrupt During handling of the above exception, another exception occurred: Traceback (most recent call last): File "bin/sos", line 22, in <module> sos.execute() File "/root/sos-main/sos/__init__.py", line 187, in execute self._component.execute() File "/root/sos-main/sos/upload/__init__.py", line 137, in execute self.intro() File "/root/sos-main/sos/upload/__init__.py", line 123, in intro self.exit("Exiting on user cancel", 130) AttributeError: 'SoSUpload' object has no attribute 'exit'
I'll check this, should be easy to fix.
When pressing Ctrl+C on
ress ENTER to continue, or CTRL-C to quit
prompt, I get backtrace:Press ENTER to continue, or CTRL-C to quit ^CTraceback (most recent call last): File "/root/sos-main/sos/upload/__init__.py", line 120, in intro input(prompt) KeyboardInterrupt During handling of the above exception, another exception occurred: Traceback (most recent call last): File "bin/sos", line 22, in <module> sos.execute() File "/root/sos-main/sos/__init__.py", line 187, in execute self._component.execute() File "/root/sos-main/sos/upload/__init__.py", line 137, in execute self.intro() File "/root/sos-main/sos/upload/__init__.py", line 123, in intro self.exit("Exiting on user cancel", 130) AttributeError: 'SoSUpload' object has no attribute 'exit'
Fixed. I used exit() instead of _exit(), which is the one implemented in Soscomponent.
At a bare minimum, a new component should be implementing all the abstractions that it needs to operate solo, not acting as a wrapper to existing functionality.
This means the upload logic needs to be separated from its current location in
Policy
, and implemented as a discrete unit. Policy should then control the default setting, and users should be able to directsos
to chose an upload target/profile/whatever we want to call it as an override. E.G. if I have an sos report locally on my Fedora workstation that was taken from a RHEL box, and I am unable due to some network policy to directly upload from the RHEL box, then on my Fedora system I should be able to send that sos report to Red Hat.Further, any current or future usage of the component's functionality should go through the actual component code. Much like we do with
sos clean
, when--clean
is used for a report being generated. We hook into the component from within report, to ensure we use the exact code flow for cleaning the archive as we would by running a clean after-the-fact.
I agree with everything above, but the idea behind this PR is to be a first implementation to get the upload component started, and then move things carefully from policy to upload. Could this approach be acceptable?
I support this initial implementation of the feature to let enhance sos
capabilities for a low cost. The discussion about refactorization (what precisely should be moved to some new *Upload*
classes) can be lengthy, while we can already offer this feature as is.
I was thinking to raise the same concern, but I realized I would see beneficial for the discussion about refactorization if we already has some implementation in hand. With the current code, it is hard for me to specify "cut this away from here and put it (there)", if we have no "(there)". With the SosUpload
class, I have better description of the "(there)". So having this initial implementation merged, it will be much more easier to have tat conversation - at least for me, this can be subjective.
If somebody sees as a potential threat "we accept this initial implementation, but will never refactor the code as needed, and we dont want that technical debt here", then I can make a commitment: once there will be an agreement about the refactorisation and if nobody(*) will have time to implement it, I will work on such PR.
(*) nobody including Jose as the primary person to implement. I assume he will be the primary person to make his own feature to make it complete. On the other side, there can be various reasons he won't be able to do the refactorisation (time, other work on sos, willingness, whatever). And then anybody else (with me as the volunteer with above commitment) can contribute that way.
If somebody sees as a potential threat "we accept this initial implementation, but will never refactor the code as needed, and we dont want that technical debt here", then I can make a commitment: once there will be an agreement about the refactorisation and if nobody(*) will have time to implement it, I will work on such PR.
(*) nobody including Jose as the primary person to implement. I assume he will be the primary person to make his own feature to make it complete. On the other side, there can be various reasons he won't be able to do the refactorisation (time, other work on sos, willingness, whatever). And then anybody else (with me as the volunteer with above commitment) can contribute that way.
On this note, I already started moving things around from policies/distros just after I sent this PR - this is not something I want to leave abandoned, or done in six months time or more, but as soon as possible. But also I want to make sure I cover all the possible cases, and the upload code in policies has been there for a long time, working perfectly, so want to be extra careful while refactoring.
This commit marks the beginning of the addition of a new 'upload' component for sos, which can be used to upload already created sos reports, collects, or other files like logs or vmcores to a policy defined location.
The user needs to specify a file location, and can make use of any of the options that exist nowadays for the --upload option.
This first commit includes:
Related: RHEL-23032, SUPDEV-138, CLIOT-481
Please place an 'X' inside each '[]' to confirm you adhere to our Contributor Guidelines