]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rgw/common.py
7 import botocore
. exceptions
10 from time
import sleep
12 log
. basicConfig ( format
= ' %(message)s ' , level
= log
. DEBUG
)
13 log
. getLogger ( 'botocore' ). setLevel ( log
. CRITICAL
)
14 log
. getLogger ( 'boto3' ). setLevel ( log
. CRITICAL
)
15 log
. getLogger ( 'urllib3' ). setLevel ( log
. CRITICAL
)
17 def exec_cmd ( cmd
, wait
= True , ** kwargs
):
18 check_retcode
= kwargs
. pop ( 'check_retcode' , True )
19 kwargs
[ 'shell' ] = True
20 kwargs
[ 'stdout' ] = subprocess
. PIPE
21 proc
= subprocess
. Popen ( cmd
, ** kwargs
)
24 out
, _
= proc
. communicate ()
26 assert ( proc
. returncode
== 0 )
28 return ( out
, proc
. returncode
)
31 def create_user ( uid
, display_name
, access_key
, secret_key
):
32 _
, ret
= exec_cmd ( f
'radosgw-admin user create --uid {uid} --display-name " {display_name} " --access-key {access_key} --secret {secret_key} ' , check_retcode
= False )
33 assert ( ret
== 0 or errno
. EEXIST
)
35 def boto_connect ( access_key
, secret_key
, config
= None ):
36 def try_connect ( portnum
, ssl
, proto
):
37 endpoint
= proto
+ '://localhost:' + portnum
38 conn
= boto3
. resource ( 's3' ,
39 aws_access_key_id
= access_key
,
40 aws_secret_access_key
= secret_key
,
42 endpoint_url
= endpoint
,
47 list ( conn
. buckets
. limit ( 1 )) # just verify we can list buckets
48 except botocore
. exceptions
. ConnectionError
as e
:
51 print ( 'connected to' , endpoint
)
54 return try_connect ( '80' , False , 'http' )
55 except botocore
. exceptions
. ConnectionError
:
56 try : # retry on non-privileged http port
57 return try_connect ( '8000' , False , 'http' )
58 except botocore
. exceptions
. ConnectionError
:
60 return try_connect ( '443' , True , 'https' )
62 def put_objects ( bucket
, key_list
):
65 o
= bucket
. put_object ( Key
= key
, Body
= b
"some_data" )
66 objs
. append (( o
. key
, o
. version_id
))
69 def create_unlinked_objects ( conn
, bucket
, key_list
):
70 # creates an unlinked/unlistable object for each key in key_list
74 exec_cmd ( 'ceph config set client rgw_debug_inject_set_olh_err 2' )
75 exec_cmd ( 'ceph config set client rgw_debug_inject_olh_cancel_modification_err true' )
78 tag
= str ( random
. randint ( 0 , 1_000_000 ))
80 bucket
. put_object ( Key
= key
, Body
= b
"some_data" , Metadata
= {
83 except Exception as e
:
85 out
= exec_cmd ( f
'radosgw-admin bi list --bucket {bucket.name} --object {key} ' )
86 instance_entries
= filter (
87 lambda x
: x
[ 'type' ] == 'instance' ,
88 json
. loads ( out
. replace ( b
' \x80 ' , b
'0x80' )))
90 for ie
in instance_entries
:
91 instance_id
= ie
[ 'entry' ][ 'instance' ]
92 ov
= conn
. ObjectVersion ( bucket
. name
, key
, instance_id
). head ()
93 if ov
[ 'Metadata' ] and ov
[ 'Metadata' ][ 'tag' ] == tag
:
94 object_versions
. append (( key
, instance_id
))
98 raise Exception ( f
'failed to create unlinked object for key= {key} ' )
100 exec_cmd ( 'ceph config rm client rgw_debug_inject_set_olh_err' )
101 exec_cmd ( 'ceph config rm client rgw_debug_inject_olh_cancel_modification_err' )
102 return object_versions