天天看点

python编写api调用ceph对象网关

<code>#_*_coding:utf-8_*_</code>

<code>#yum install python-boto</code>

<code>import</code> <code>boto</code>

<code>import</code> <code>boto.s3.connection</code>

<code>#pip install filechunkio</code>

<code>from</code> <code>filechunkio </code><code>import</code>  <code>filechunkio</code>

<code>import</code> <code>math</code>

<code>import</code>  <code>threading</code>

<code>import</code> <code>os</code>

<code>import</code> <code>queue</code>

<code>class</code> <code>chunk(</code><code>object</code><code>):</code>

<code>    </code><code>num </code><code>=</code> <code>0</code>

<code>    </code><code>offset </code><code>=</code> <code>0</code>

<code>    </code><code>len</code> <code>=</code> <code>0</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>,n,o,l):</code>

<code>        </code><code>self</code><code>.num</code><code>=</code><code>n</code>

<code>        </code><code>self</code><code>.offset</code><code>=</code><code>o</code>

<code>        </code><code>self</code><code>.length</code><code>=</code><code>l</code>

<code>class</code> <code>connection(</code><code>object</code><code>):</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>,access_key,secret_key,ip,port,is_secure</code><code>=</code><code>false</code><code>,chrunksize</code><code>=</code><code>8</code><code>&lt;&lt;</code><code>20</code><code>): </code><code>#chunksize最小8m否则上传过程会报错</code>

<code>        </code><code>self</code><code>.conn</code><code>=</code><code>boto.connect_s3(</code>

<code>        </code><code>aws_access_key_id</code><code>=</code><code>access_key,</code>

<code>        </code><code>aws_secret_access_key</code><code>=</code><code>secret_key,</code>

<code>        </code><code>host</code><code>=</code><code>ip,port</code><code>=</code><code>port,</code>

<code>        </code><code>is_secure</code><code>=</code><code>is_secure,</code>

<code>        </code><code>calling_format</code><code>=</code><code>boto.s3.connection.ordinarycallingformat()</code>

<code>        </code><code>)</code>

<code>        </code><code>self</code><code>.chrunksize</code><code>=</code><code>chrunksize</code>

<code>        </code><code>self</code><code>.port</code><code>=</code><code>port</code>

<code>    </code><code>#查询</code>

<code>    </code><code>def</code> <code>list_all(</code><code>self</code><code>):</code>

<code>        </code><code>all_buckets</code><code>=</code><code>self</code><code>.conn.get_all_buckets()</code>

<code>        </code><code>for</code> <code>bucket </code><code>in</code> <code>all_buckets:</code>

<code>            </code><code>print</code> <code>u</code><code>'容器名: %s'</code> <code>%</code><code>(bucket.name)</code>

<code>            </code><code>for</code> <code>key </code><code>in</code> <code>bucket.</code><code>list</code><code>():</code>

<code>                </code><code>print</code> <code>' '</code><code>*</code><code>5</code><code>,</code><code>"%-20s%-20s%-20s%-40s%-20s"</code> <code>%</code><code>(key.mode,key.owner.</code><code>id</code><code>,key.size,key.last_modified.split(</code><code>'.'</code><code>)[</code><code>0</code><code>],key.name)</code>

<code>    </code><code>def</code> <code>list_single(</code><code>self</code><code>,bucket_name):</code>

<code>        </code><code>try</code><code>:</code>

<code>            </code><code>single_bucket </code><code>=</code> <code>self</code><code>.conn.get_bucket(bucket_name)</code>

<code>        </code><code>except</code> <code>exception as e:</code>

<code>            </code><code>print</code> <code>'bucket %s is not exist'</code> <code>%</code><code>bucket_name</code>

<code>            </code><code>return</code>

<code>        </code><code>print</code> <code>u</code><code>'容器名: %s'</code> <code>%</code> <code>(single_bucket.name)</code>

<code>        </code><code>for</code> <code>key </code><code>in</code> <code>single_bucket.</code><code>list</code><code>():</code>

<code>            </code><code>print</code> <code>' '</code> <code>*</code> <code>5</code><code>, </code><code>"%-20s%-20s%-20s%-40s%-20s"</code> <code>%</code> <code>(key.mode, key.owner.</code><code>id</code><code>, key.size, key.last_modified.split(</code><code>'.'</code><code>)[</code><code>0</code><code>], key.name)</code>

<code>    </code><code>#普通小文件下载:文件大小&lt;=8m</code>

<code>    </code><code>def</code> <code>dowload_file(</code><code>self</code><code>,filepath,key_name,bucket_name):</code>

<code>        </code><code>all_bucket_name_list </code><code>=</code> <code>[i.name </code><code>for</code> <code>i </code><code>in</code> <code>self</code><code>.conn.get_all_buckets()]</code>

<code>        </code><code>if</code> <code>bucket_name </code><code>not</code> <code>in</code> <code>all_bucket_name_list:</code>

<code>            </code><code>print</code> <code>'bucket %s is not exist,please try again'</code> <code>%</code> <code>(bucket_name)</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>bucket </code><code>=</code> <code>self</code><code>.conn.get_bucket(bucket_name)</code>

<code>        </code><code>all_key_name_list </code><code>=</code> <code>[i.name </code><code>for</code> <code>i </code><code>in</code> <code>bucket.get_all_keys()]</code>

<code>        </code><code>if</code> <code>key_name </code><code>not</code> <code>in</code> <code>all_key_name_list:</code>

<code>            </code><code>print</code> <code>'file %s is not exist,please try again'</code> <code>%</code> <code>(key_name)</code>

<code>            </code><code>key </code><code>=</code> <code>bucket.get_key(key_name)</code>

<code>        </code><code>if</code> <code>not</code> <code>os.path.exists(os.path.dirname(filepath)):</code>

<code>            </code><code>print</code> <code>'filepath %s is not exists, sure to create and try again'</code> <code>%</code> <code>(filepath)</code>

<code>        </code><code>if</code> <code>os.path.exists(filepath):</code>

<code>            </code><code>while</code> <code>true</code><code>:</code>

<code>                </code><code>d_tag </code><code>=</code> <code>raw_input</code><code>(</code><code>'file %s already exists, sure you want to cover (y/n)?'</code> <code>%</code> <code>(key_name)).strip()</code>

<code>                </code><code>if</code> <code>d_tag </code><code>not</code> <code>in</code> <code>[</code><code>'y'</code><code>, </code><code>'n'</code><code>] </code><code>or</code> <code>len</code><code>(d_tag) </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>                    </code><code>continue</code>

<code>                </code><code>elif</code> <code>d_tag </code><code>=</code><code>=</code> <code>'y'</code><code>:</code>

<code>                    </code><code>os.remove(filepath)</code>

<code>                    </code><code>break</code>

<code>                </code><code>elif</code> <code>d_tag </code><code>=</code><code>=</code> <code>'n'</code><code>:</code>

<code>                    </code><code>return</code>

<code>        </code><code>os.mknod(filepath)</code>

<code>            </code><code>key.get_contents_to_filename(filepath)</code>

<code>        </code><code>except</code> <code>exception:</code>

<code>            </code><code>pass</code>

<code>    </code><code># 普通小文件上传:文件大小&lt;=8m</code>

<code>    </code><code>def</code> <code>upload_file(</code><code>self</code><code>,filepath,key_name,bucket_name):</code>

<code>            </code><code>print</code> <code>'bucket %s is not exist'</code> <code>%</code> <code>bucket_name</code>

<code>            </code><code>tag </code><code>=</code> <code>raw_input</code><code>(</code><code>'do you want to create the bucket %s: (y/n)?'</code> <code>%</code> <code>bucket_name).strip()</code>

<code>            </code><code>while</code> <code>tag </code><code>not</code> <code>in</code> <code>[</code><code>'y'</code><code>, </code><code>'n'</code><code>]:</code>

<code>                </code><code>tag </code><code>=</code> <code>raw_input</code><code>(</code><code>'please input (y/n)'</code><code>).strip()</code>

<code>            </code><code>if</code> <code>tag </code><code>=</code><code>=</code> <code>'n'</code><code>:</code>

<code>                </code><code>return</code>

<code>            </code><code>elif</code> <code>tag </code><code>=</code><code>=</code> <code>'y'</code><code>:</code>

<code>                </code><code>self</code><code>.conn.create_bucket(bucket_name)</code>

<code>                </code><code>bucket </code><code>=</code> <code>self</code><code>.conn.get_bucket(bucket_name)</code>

<code>        </code><code>if</code> <code>key_name </code><code>in</code> <code>all_key_name_list:</code>

<code>                </code><code>f_tag </code><code>=</code> <code>raw_input</code><code>(u</code><code>'file already exists, sure you want to cover (y/n)?: '</code><code>).strip()</code>

<code>                </code><code>if</code> <code>f_tag </code><code>not</code> <code>in</code> <code>[</code><code>'y'</code><code>, </code><code>'n'</code><code>] </code><code>or</code> <code>len</code><code>(f_tag) </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>                </code><code>elif</code> <code>f_tag </code><code>=</code><code>=</code> <code>'y'</code><code>:</code>

<code>                </code><code>elif</code> <code>f_tag </code><code>=</code><code>=</code> <code>'n'</code><code>:</code>

<code>        </code><code>key</code><code>=</code><code>bucket.new_key(key_name)</code>

<code>        </code><code>if</code> <code>not</code> <code>os.path.exists(filepath):</code>

<code>            </code><code>print</code> <code>'file %s does not exist, please make sure you want to upload file path and try again'</code> <code>%</code><code>(key_name)</code>

<code>            </code><code>f</code><code>=</code><code>file</code><code>(filepath,</code><code>'rb'</code><code>)</code>

<code>            </code><code>data</code><code>=</code><code>f.read()</code>

<code>            </code><code>key.set_contents_from_string(data)</code>

<code>    </code><code>def</code> <code>delete_file(</code><code>self</code><code>,key_name,bucket_name):</code>

<code>            </code><code>bucket.delete_key(key.name)</code>

<code>    </code><code>def</code> <code>delete_bucket(</code><code>self</code><code>,bucket_name):</code>

<code>            </code><code>self</code><code>.conn.delete_bucket(bucket.name)</code>

<code>    </code><code>#队列生成</code>

<code>    </code><code>def</code> <code>init_queue(</code><code>self</code><code>,filesize,chunksize):   </code><code>#8&lt;&lt;20 :8*2**20</code>

<code>        </code><code>chunkcnt</code><code>=</code><code>int</code><code>(math.ceil(filesize</code><code>*</code><code>1.0</code><code>/</code><code>chunksize))</code>

<code>        </code><code>q</code><code>=</code><code>queue.queue(maxsize</code><code>=</code><code>chunkcnt)</code>

<code>        </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>0</code><code>,chunkcnt):</code>

<code>            </code><code>offset</code><code>=</code><code>chunksize</code><code>*</code><code>i</code>

<code>            </code><code>length</code><code>=</code><code>min</code><code>(chunksize,filesize</code><code>-</code><code>offset)</code>

<code>            </code><code>c</code><code>=</code><code>chunk(i</code><code>+</code><code>1</code><code>,offset,length)</code>

<code>            </code><code>q.put(c)</code>

<code>        </code><code>return</code> <code>q</code>

<code>    </code><code>#分片上传object</code>

<code>    </code><code>def</code> <code>upload_trunk(</code><code>self</code><code>,filepath,mp,q,</code><code>id</code><code>):</code>

<code>        </code><code>while</code> <code>not</code> <code>q.empty():</code>

<code>            </code><code>chunk</code><code>=</code><code>q.get()</code>

<code>            </code><code>fp</code><code>=</code><code>filechunkio(filepath,</code><code>'r'</code><code>,offset</code><code>=</code><code>chunk.offset,bytes</code><code>=</code><code>chunk.length)</code>

<code>            </code><code>mp.upload_part_from_file(fp,part_num</code><code>=</code><code>chunk.num)</code>

<code>            </code><code>fp.close()</code>

<code>            </code><code>q.task_done()</code>

<code>    </code><code>#文件大小获取----&gt;s3分片上传对象生成-----&gt;初始队列生成(---------------&gt;文件切,生成切分对象)</code>

<code>    </code><code>def</code> <code>upload_file_multipart(</code><code>self</code><code>,filepath,key_name,bucket_name,threadcnt</code><code>=</code><code>8</code><code>):</code>

<code>        </code><code>filesize</code><code>=</code><code>os.stat(filepath).st_size</code>

<code>            </code><code>bucket</code><code>=</code><code>self</code><code>.conn.get_bucket(bucket_name)</code>

<code>            </code><code>tag</code><code>=</code><code>raw_input</code><code>(</code><code>'do you want to create the bucket %s: (y/n)?'</code> <code>%</code><code>bucket_name).strip()</code>

<code>            </code><code>while</code> <code>tag </code><code>not</code> <code>in</code> <code>[</code><code>'y'</code><code>,</code><code>'n'</code><code>]:</code>

<code>                </code><code>tag</code><code>=</code><code>raw_input</code><code>(</code><code>'please input (y/n)'</code><code>).strip()</code>

<code>        </code><code>all_key_name_list</code><code>=</code><code>[i.name </code><code>for</code> <code>i </code><code>in</code> <code>bucket.get_all_keys()]</code>

<code>        </code><code>if</code> <code>key_name  </code><code>in</code> <code>all_key_name_list:</code>

<code>                </code><code>f_tag</code><code>=</code><code>raw_input</code><code>(u</code><code>'file already exists, sure you want to cover (y/n)?: '</code><code>).strip()</code>

<code>                </code><code>if</code> <code>f_tag </code><code>not</code> <code>in</code> <code>[</code><code>'y'</code><code>,</code><code>'n'</code><code>] </code><code>or</code> <code>len</code><code>(f_tag) </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>        </code><code>mp</code><code>=</code><code>bucket.initiate_multipart_upload(key_name)</code>

<code>        </code><code>q</code><code>=</code><code>self</code><code>.init_queue(filesize,</code><code>self</code><code>.chrunksize)</code>

<code>        </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>0</code><code>,threadcnt):</code>

<code>            </code><code>t</code><code>=</code><code>threading.thread(target</code><code>=</code><code>self</code><code>.upload_trunk,args</code><code>=</code><code>(filepath,mp,q,i))</code>

<code>            </code><code>t.setdaemon(</code><code>true</code><code>)</code>

<code>            </code><code>t.start()</code>

<code>        </code><code>q.join()</code>

<code>        </code><code>mp.complete_upload()</code>

<code>    </code><code>#文件分片下载</code>

<code>    </code><code>def</code> <code>download_chrunk(</code><code>self</code><code>,filepath,key_name,bucket_name,q,</code><code>id</code><code>):</code>

<code>            </code><code>chrunk</code><code>=</code><code>q.get()</code>

<code>            </code><code>offset</code><code>=</code><code>chrunk.offset</code>

<code>            </code><code>length</code><code>=</code><code>chrunk.length</code>

<code>            </code><code>resp</code><code>=</code><code>bucket.connection.make_request(</code><code>'get'</code><code>,bucket_name,key_name,headers</code><code>=</code><code>{</code><code>'range'</code><code>:</code><code>"bytes=%d-%d"</code> <code>%</code><code>(offset,offset</code><code>+</code><code>length)})</code>

<code>            </code><code>data</code><code>=</code><code>resp.read(length)</code>

<code>            </code><code>fp</code><code>=</code><code>filechunkio(filepath,</code><code>'r+'</code><code>,offset</code><code>=</code><code>chrunk.offset,bytes</code><code>=</code><code>chrunk.length)</code>

<code>            </code><code>fp.write(data)</code>

<code>    </code><code>def</code> <code>download_file_multipart(</code><code>self</code><code>,filepath,key_name,bucket_name,threadcnt</code><code>=</code><code>8</code><code>):</code>

<code>        </code><code>all_bucket_name_list</code><code>=</code><code>[i.name </code><code>for</code> <code>i </code><code>in</code> <code>self</code><code>.conn.get_all_buckets()]</code>

<code>            </code><code>print</code> <code>'bucket %s is not exist,please try again'</code> <code>%</code><code>(bucket_name)</code>

<code>            </code><code>print</code> <code>'file %s is not exist,please try again'</code> <code>%</code><code>(key_name)</code>

<code>            </code><code>key</code><code>=</code><code>bucket.get_key(key_name)</code>

<code>        </code><code>filesize</code><code>=</code><code>key.size</code>

<code>            </code><code>t</code><code>=</code><code>threading.thread(target</code><code>=</code><code>self</code><code>.download_chrunk,args</code><code>=</code><code>(filepath,key_name,bucket_name,q,i))</code>

<code>    </code><code>def</code> <code>generate_object_download_urls(</code><code>self</code><code>,key_name,bucket_name,valid_time</code><code>=</code><code>0</code><code>):</code>

<code>            </code><code>key.set_canned_acl(</code><code>'public-read'</code><code>)</code>

<code>            </code><code>download_url </code><code>=</code> <code>key.generate_url(valid_time, query_auth</code><code>=</code><code>false</code><code>, force_http</code><code>=</code><code>true</code><code>)</code>

<code>            </code><code>if</code> <code>self</code><code>.port !</code><code>=</code> <code>80</code><code>:</code>

<code>                </code><code>x1</code><code>=</code><code>download_url.split(</code><code>'/'</code><code>)[</code><code>0</code><code>:</code><code>3</code><code>]</code>

<code>                </code><code>x2</code><code>=</code><code>download_url.split(</code><code>'/'</code><code>)[</code><code>3</code><code>:]</code>

<code>                </code><code>s1</code><code>=</code><code>u</code><code>'/'</code><code>.join(x1)</code>

<code>                </code><code>s2</code><code>=</code><code>u</code><code>'/'</code><code>.join(x2)</code>

<code>                </code><code>s3</code><code>=</code><code>':%s/'</code> <code>%</code><code>(</code><code>str</code><code>(</code><code>self</code><code>.port))</code>

<code>                </code><code>download_url</code><code>=</code><code>s1</code><code>+</code><code>s3</code><code>+</code><code>s2</code>

<code>                </code><code>print</code> <code>download_url</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>#约定:</code>

<code>    </code><code>#1:filepath指本地文件的路径(上传路径or下载路径),指的是绝对路径</code>

<code>    </code><code>#2:bucket_name相当于文件在对象存储中的目录名或者索引名</code>

<code>    </code><code>#3:key_name相当于文件在对象存储中对应的文件名或文件索引</code>

<code>    </code><code>access_key </code><code>=</code> <code>"65iy4ec1bsfynh6shwgw"</code>

<code>    </code><code>secret_key </code><code>=</code> <code>"vinfiftlhhrpt2myk44dkwgvxzb82ayqlrczgylx"</code>

<code>    </code><code>ip</code><code>=</code><code>'172.16.201.36'</code>

<code>    </code><code>port</code><code>=</code><code>8080</code>

<code>    </code><code>conn</code><code>=</code><code>connection(access_key,secret_key,ip,port)</code>

<code>    </code><code>#查看所有bucket以及其包含的文件</code>

<code>    </code><code>#conn.list_all()</code>

<code>    </code><code>#简单上传,用于文件大小&lt;=8m</code>

<code>    </code><code># conn.upload_file('/etc/passwd','passwd','test_bucket01')</code>

<code>    </code><code>#查看单一bucket下所包含的文件信息</code>

<code>    </code><code># conn.list_single('test_bucket01')</code>

<code>    </code><code>#简单下载,用于文件大小&lt;=8m</code>

<code>    </code><code># conn.dowload_file('/lhf_test/test01','passwd','test_bucket01')</code>

<code>    </code><code>#删除文件</code>

<code>    </code><code># conn.delete_file('passwd','test_bucket01')</code>

<code>    </code><code>#</code>

<code>    </code><code>#删除bucket</code>

<code>    </code><code># conn.delete_bucket('test_bucket01')</code>

<code>    </code><code># conn.list_all()</code>

<code>    </code><code>#切片上传(多线程),用于文件大小&gt;8m,8m可修改,但不能小于8m,否则会报错切片太小</code>

<code>    </code><code># conn.upload_file_multipart('/etc/passwd','passwd_multi_upload','test_bucket01')</code>

<code>    </code><code># 切片下载(多线程),用于文件大小&gt;8m,8m可修改,但不能小于8m,否则会报错切片太小</code>

<code>    </code><code># conn.download_file_multipart('/lhf_test/passwd_multi_dowload','passwd_multi_upload','test_bucket01')</code>

<code>    </code><code>#生成下载url</code>

<code>    </code><code>#conn.generate_object_download_urls('passwd_multi_upload','test_bucket01')</code>