• ceph rbd 封装api


    1.安装python,uwsgi,nginx环境

      pip安装省略

    yumgroupinstall"Developmenttools"
    yuminstallzlib-develbzip2-develpcre-developenssl-develncurses-develsqlite-develreadline-develtk-devel
    yuminstallpython-devel
    pipinstalluwsgi

    2.明白 Restful API
      http://www.ruanyifeng.com/blog/2014/05/restful_api.html
    3.了解flask框架
      http://www.pythondoc.com/flask-restful/first.html
    4.调用python插件库
      http://docs.ceph.org.cn/rbd/librbdpy/
    5.写接口程序

      

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from flask import Flask, jsonify, make_response
    import rados
    import rbd
    from flask.ext.httpauth import HTTPBasicAuth
    import time
    '''
    ceph 接口封装,主要实现 CRD 功能
    curl xxx.xx.xx.xx2/ceph/v1.0/rbd -u admin:d41d8cd98f00b204e9fdsafdsafdasf333f
    curl -X POST xxx.xx.xx.xx/ceph/v1.0/rbd/images/V0/10234556 -u admin:d8cd98f00b204e9fdsafdsafdasf333f
    curl -X DELETE xxx.xx.xx.xx/ceph/v1.0/rbd/images/cai-ceph-a3 -u admin:d8cd98f00b204e9fdsafdsafdasf333f
    作者: 蔡锡生
    '''
    
    auth = HTTPBasicAuth()
    application = Flask(__name__)
    application.debug = True
    
    
    def connect_ceph():
        cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
        cluster.connect()
        ioctx = cluster.open_ioctx('rbd')
        return ioctx
    
    
    @auth.get_password
    def get_password(username):
        if username == 'admin':
            return 'd8cd98f00b204e9fdsafdsafdasf333f'
        return None
    
    
    @auth.error_handler
    def unauthorized():
        return make_response(jsonify({'error': 'Unauthorized access'}), 401)
    
    
    @application.route('/')
    def index():
        return "Hello, world"
    
    
    @application.route('/ceph/v1.0/rbd', methods=['GET'])
    @auth.login_required
    def get_rbd_list():
        ioctx = connect_ceph()
        rbd_inst = rbd.RBD()
        images = rbd_inst.list(ioctx)
        return jsonify({"code": 200, "info": images})
    
    
    @application.route('/ceph/v1.0/rbd/images/<image_name>/<int:size>', methods=['POST'])
    @auth.login_required
    def create_volume(image_name, size):
        ioctx = connect_ceph()
        rbd_inst = rbd.RBD()
        try:
            rbd_inst.create(ioctx, image_name, size)
            return jsonify({"code": 200, "info": "create volume success"})
        except Exception as e:
            return jsonify({"code": 400, "info": "create volume failure
    "+e.message})
    
    
    @application.route('/ceph/v1.0/rbd/images/<image_name>',methods=['DELETE'])
    @auth.login_required
    def delete_rbd_image(image_name):
        if image_name == '' or len(image_name) == 0:
            return jsonify({"code": 400, "info": "parameter can't be null"})
        ioctx = connect_ceph()
        print dir(rbd)
        rbd_inst = rbd.RBD()
        if image_name in rbd_inst.list(ioctx):
            try:
                time.sleep(3)
                rbd_inst.remove(ioctx, image_name)
                return jsonify({"code": 200, "info": "delete success"})
            except Exception as e:
                if e.message == 'error removing image':
                    delete_rbd_image(image_name)
                return jsonify({"code": 400, "info": e.message})
        else:
            return jsonify({"code": 403, "info": "requests image_name not be exist"})
    
    if __name__ == '__main__':
        application.run(host='0.0.0.0', port=80)
    

     

    6.uwsgi 配置

      vim uwsgi.ini

    [uwsgi]
    master=true
    wsgi-file=manage.py
    callable=application
    socket=/opt/soft/python-ceph-api/ceph-api.sock
    chmod-socket=664
    processes=10
    threads=4
    buffer-size=32768
    touch-reload=/opt/soft/python-ceph-api
    module=rbd_ap
    

      

    7.nginx 配置

    vim  /etc/nging/conf.d/ceph_api.conf

    upstreamscloud_django{
    	#serverunix:///path/to/your/mysite/mysite.sock;#forafilesocket
    	serverunix:///opt/soft/python-ceph-api/ceph-api.sock;#forawebportsocket(we'llusethisfirst)
    }
    
    server{
    	#theportyoursitewillbeservedon
    	listen20000;
    	
    	#thedomainnameitwillservefor
    	#server_namewww.scloud.cn;#substituteyourmachine'sIPaddressorFQDN
    	charsetutf-8;
    	
    	#maxuploadsize
    	client_max_body_size75M;#adjusttotaste
    	
    	#Djangomedia
    	location/media{
    		#alias/opt/soddft/scloud/media;#yourDjangoproject'smediafiles-amendasrequired
    	}
    	
    	location/static{
    		#alias/opt/soft/scloud/static;#yourDjangoproject'sstaticfiles-amendasrequired
    	}
    	
    	#Finally,sendallnon-mediarequeststotheDjangoserver.
    	location/{
    		uwsgi_passscloud_django;
    		include/etc/nginx/uwsgi_params;#theuwsgi_paramsfileyouinstalled
    	}
    
    }
    

      

    没有什么是写一万遍还不会的,如果有那就再写一万遍。
  • 相关阅读:
    Web实现大文件分片上传的方法
    kinova环境配置
    c++ stl list
    echarts饼图
    js函数
    飞浆测试日志
    IfcRevolvedAreaSolidTapered
    matlab一元二次方程求根
    运行日志
    常用的sql
  • 原文地址:https://www.cnblogs.com/waken-captain/p/8322249.html
Copyright © 2020-2023  润新知