[ad_1]
python-swiftclient ドキュメントを読んだ後、OpenStack Object Storage に接続し、いくつかのファイルをコンテナにアップロードするための python-swiftclient モジュールを含む Python スクリプトを作成しました: https://docs.openstack.org/python-swiftclient/latest/クライアントAPI.html
拡張子 .gz で終わるファイルをアップロードする場合は問題なく動作しますが、拡張子 .tar.bz2 で終わる圧縮ファイルの場合はエラーが発生します。
Python スクリプトと、それを実行した後に発生するエラーを含めました。 私のどこが間違っているのか教えてください。この問題を解決するために何らかの支援が必要です。
私が試したこと:
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
あなたの問題はメッセージの中にあります –
引用:TypeError: オブジェクトまたはタイプ ‘TarInfo’ に len() がありません
「swiftclient.utils」モジュールの「iter_wrapper」関数は、データのチャンクの長さを読み取ろうとしていますが、代わりに「TarInfo」オブジェクトに遭遇しました。このオブジェクトには、定義または設定された長さがありません。 「tarfile.TarFile」オブジェクトをコンテンツパラメータとして「swift_conn.put_object」に直接コピーします。 「put_object」メソッドは「read()」メソッドを持つファイルのようなオブジェクトを想定しているため、これは機能しません。
tar.bz2 ファイルの内容を読み取り、それをファイルのようなオブジェクトとして「put_object」に渡す必要があります。 Python ファイルの read() メソッド[^]
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]
コメント