[ad_1]
मैंने एक पायथन स्क्रिप्ट लिखी जिसमें ओपनस्टैक ऑब्जेक्ट स्टोरेज से कनेक्ट करने के लिए पायथन-स्विफ्टक्लाइंट मॉड्यूल शामिल था और पायथन-स्विफ्टक्लाइंट दस्तावेज़ को पढ़ने के बाद कंटेनर में कुछ फ़ाइलें अपलोड की गईं: https://docs.openstack.org/python-swiftclient/latest/ क्लाइंट-api.html
यदि मैं .gz एक्सटेंशन के साथ समाप्त होने वाली फ़ाइल अपलोड करता हूं तो यह बहुत अच्छा काम करता है, हालांकि, जब संपीड़ित फ़ाइल की बात आती है जो एक्सटेंशन .tar.bz2 के साथ समाप्त होती है तो मुझे कुछ त्रुटियां मिल रही हैं।
मैंने पायथन स्क्रिप्ट और इसे चलाने के बाद मिलने वाली त्रुटियों को शामिल किया है। कृपया मुझे दिखाएँ कि मैं कहाँ गलत हूँ, और मैं इस मुद्दे को सुलझाने में कुछ सहायता चाहूँगा।
मैंने क्या प्रयास किया है:
from keystoneauth1 import session from keystoneauth1.identity import v3 from swiftclient.client import Connection from swiftclient.client import ClientException import gzip import tarfile # Create a password auth plugin auth = v3.Password(auth_url='https://cloud.company.com:5000/v3/', username='myaccount', password='mypassword', user_domain_name='Default', project_name='myproject', project_domain_name='Default') # Create session keystone_session = session.Session(auth=auth) # Create swiftclient Connection swift_conn = Connection(session=keystone_session) # Create a new object with the contents of Netbox database backup with gzip.open('/var/backup/netbox_backups/netbox_2024-03-16.psql.gz', 'rb') as file: swift_conn.put_object( container, 'object_netbox_2024-03-16.psql.gz', contents=file, content_type='application/gzip' ) # Confirm the presence of the object holding the Netbox database backup obj1 = 'object_netbox_2024-03-16.psql.gz' container = 'netbox-backups' try: resp_headers = swift_conn.head_object(container, obj1) print("The object " + obj1 + " was successfully created") except ClientException as e: if e.http_status == '404': print("The object " + obj1 + " was not found!") else: print("An error occurred checking for the existence of the object " + obj1) # Create a new object with the contents of the compressed Netbox media backup with tarfile.open("/var/backup/netbox_backups/netbox_media_2024-03-16.tar.bz2", "r:bz2") as file_tar_bz2: swift_conn.put_object( container, 'object_netbox_media_2024-03-16.tar.bz2', contents=file_tar_bz2, content_type='application/x-tar' ) # Confirm the presence of the object holding the compressed Netbox media backup obj2 = 'object_netbox_media_2024-03-16.tar.bz2' container = 'netbox-backups' try: resp_headers = swift_conn.head_object(container, obj2) print("The object " + obj2 + " was successfully created") except ClientException as e: if e.http_status == '404': print("The object " + obj2 + " was not found!") else: print("An error occurred checking for the existence of the object " + obj2)
स्क्रिप्ट चलाने के बाद मुझे जो त्रुटियाँ मिल रही हैं वे नीचे दी गई हैं
(venv) [root@scs-sandbox01 backups]# python netbox_backups_transfer.py The object object_netbox_2024-03-16.psql.gz was successfully created Traceback (most recent call last): File "/opt/scripts/netbox_backups_transfer.py", line 52, in <module> swift_conn.put_object( File "/opt/netbox/venv/lib64/python3.9/site-packages/swiftclient/client.py", line 1963, in put_object return self._retry(reset_func, put_object, container, obj, contents, File "/opt/netbox/venv/lib64/python3.9/site-packages/swiftclient/client.py", line 1797, in _retry rv = func(self.url, self.token, *args, File "/opt/netbox/venv/lib64/python3.9/site-packages/swiftclient/client.py", line 1421, in put_object conn.request('PUT', path, contents, headers) File "/opt/netbox/venv/lib64/python3.9/site-packages/swiftclient/client.py", line 416, in request self.resp = self._request(method, url, headers=headers, data=data, File "/opt/netbox/venv/lib64/python3.9/site-packages/swiftclient/client.py", line 400, in _request return self.request_session.request(*arg, **kwarg) File "/opt/netbox/venv/lib64/python3.9/site-packages/requests/sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) File "/opt/netbox/venv/lib64/python3.9/site-packages/requests/sessions.py", line 703, in send r = adapter.send(request, **kwargs) File "/opt/netbox/venv/lib64/python3.9/site-packages/requests/adapters.py", line 486, in send resp = conn.urlopen( File "/opt/netbox/venv/lib64/python3.9/site-packages/urllib3/connectionpool.py", line 790, in urlopen response = self._make_request( File "/opt/netbox/venv/lib64/python3.9/site-packages/urllib3/connectionpool.py", line 496, in _make_request conn.request( File "/opt/netbox/venv/lib64/python3.9/site-packages/urllib3/connection.py", line 399, in request for chunk in chunks: File "/opt/netbox/venv/lib64/python3.9/site-packages/swiftclient/utils.py", line 443, in iter_wrapper if len(chunk) == 0: TypeError: object of type 'TarInfo' has no len()
समाधान 1
आपकी समस्या संदेश में निहित है –
उद्धरण:लेखन त्रुटि: ऑब्जेक्ट या प्रकार ‘टारइन्फो’ में कोई लेन नहीं है()
आपके ‘swiftclient.utils’ मॉड्यूल में आपका ‘iter_wrapper’ फ़ंक्शन डेटा के एक हिस्से की लंबाई को पढ़ने की कोशिश कर रहा है, लेकिन इसके बजाय उसे एक ‘TarInfo’ ऑब्जेक्ट का सामना करना पड़ रहा है, जिसकी कोई परिभाषित या निर्धारित लंबाई नहीं है क्योंकि आप इसे पास कर रहे हैं सामग्री पैरामीटर के रूप में ‘tarfile.TarFile’ ऑब्जेक्ट सीधे ‘swift_conn.put_object’ पर। यह काम नहीं करेगा क्योंकि आपकी ‘put_object’ विधि ‘read()’ विधि के साथ फ़ाइल जैसी ऑब्जेक्ट की अपेक्षा करती है।
आपको tar.bz2 फ़ाइल की सामग्री को पढ़ना होगा और फिर उन्हें फ़ाइल-जैसी ऑब्जेक्ट के रूप में ‘put_object’ में पास करना होगा – पायथन फ़ाइल पढ़ें() विधि[^]
with tarfile.open("/var/backup/netbox_backups/netbox_media_2024-03-16.tar.bz2", "r:bz2") as file_tar_bz2: #Read the contents... file_contents = file_tar_bz2.read() #Create a file-like object from the contents... my_file_like_object = io.BytesIO(file_contents) #Upload the returned contents to Swift... swift_conn.put_object( container, 'object_netbox_media_2024-03-16.tar.bz2', contents=my_file_like_object, content_type='application/x-tar' )
[ad_2]
コメント