cmdb/cmdb-api/core/ci.py

189 lines
6.0 KiB
Python

# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import time
import urllib
from flask import Blueprint
from flask import request
from flask import jsonify
from flask import current_app
from flask import make_response
from flask import render_template
from flask import abort
from lib.auth import auth_with_key
from lib.ci import CIManager
from lib.search import Search
from lib.search import SearchError
from lib.utils import get_page
from lib.utils import get_per_page
from models.ci_type import CITypeCache
ci = Blueprint("ci", __name__)
@ci.route("/type/<int:type_id>", methods=["GET"])
def get_cis_by_type(type_id=None):
fields = request.args.get("fields", "").strip().split(",")
fields = filter(lambda x: x != "", fields)
ret_key = request.args.get("ret_key", "name")
if ret_key not in ('name', 'alias', 'id'):
ret_key = 'name'
page = get_page(request.values.get("page", 1))
count = get_per_page(request.values.get("count"))
manager = CIManager()
res = manager.get_cis_by_type(type_id, ret_key=ret_key,
fields=fields, page=page, per_page=count)
return jsonify(type_id=type_id, numfound=res[0],
total=len(res[2]), page=res[1], cis=res[2])
@ci.route("/<int:ci_id>", methods=['GET'])
def get_ci(ci_id=None):
fields = request.args.get("fields", "").strip().split(",")
fields = filter(lambda x: x != "", fields)
ret_key = request.args.get("ret_key", "name")
if ret_key not in ('name', 'alias', 'id'):
ret_key = 'name'
manager = CIManager()
ci = manager.get_ci_by_id(ci_id, ret_key=ret_key, fields=fields)
return jsonify(ci_id=ci_id, ci=ci)
@ci.route("/s", methods=["GET"])
@ci.route("/search", methods=["GET"])
def search():
"""@params: q: query statement
fl: filter by column
count: the number of ci
ret_key: id, name, alias
facet: statistic
wt: result format
"""
page = get_page(request.values.get("page", 1))
count = get_per_page(request.values.get("count"))
query = request.values.get('q', "")
fl = request.values.get('fl', "").split(",")
ret_key = request.values.get('ret_key', "name")
if ret_key not in ('name', 'alias', 'id'):
ret_key = 'name'
facet = request.values.get("facet", "").split(",")
wt = request.values.get('wt', 'json')
fl = filter(lambda x: x != "", fl)
facet = filter(lambda x: x != "", facet)
sort = request.values.get("sort")
start = time.time()
s = Search(query, fl, facet, page, ret_key, count, sort)
try:
response, counter, total, page, numfound, facet = s.search()
except SearchError, e:
return abort(400, str(e))
except Exception, e:
current_app.logger.error(str(e))
return abort(500, "search unknown error")
if wt == 'xml':
res = make_response(
render_template("search.xml",
counter=counter,
total=total,
result=response,
page=page,
numfound=numfound,
facet=facet))
res.headers['Content-type'] = 'text/xml'
return res
current_app.logger.debug("search time is :{0}".format(
time.time() - start))
return jsonify(numfound=numfound,
total=total,
page=page,
facet=facet,
counter=counter,
result=response)
@ci.route("", methods=["POST"])
@auth_with_key
def create_ci():
ci_type = request.values.get("ci_type")
_no_attribute_policy = request.values.get("_no_attribute_policy", "ignore")
ci_dict = dict()
for k, v in request.values.iteritems():
if k != "ci_type" and not k.startswith("_"):
ci_dict[k] = v.strip()
manager = CIManager()
current_app.logger.debug(ci_dict)
ci_id = manager.add(ci_type, exist_policy="reject",
_no_attribute_policy=_no_attribute_policy, **ci_dict)
return jsonify(ci_id=ci_id)
@ci.route("", methods=["PUT"])
@auth_with_key
def update_ci():
if request.data:
args = dict()
_args = request.data.split("&")
for arg in _args:
if arg:
args[arg.split("=")[0]] = \
urllib.unquote(urllib.unquote(arg.split("=")[1]))
else:
args = request.values
ci_type = args.get("ci_type")
_no_attribute_policy = args.get("_no_attribute_policy", "ignore")
ci_dict = dict()
for k, v in args.items():
if k != "ci_type" and not k.startswith("_"):
ci_dict[k] = v.strip()
manager = CIManager()
ci_id = manager.add(ci_type, exist_policy="replace",
_no_attribute_policy=_no_attribute_policy, **ci_dict)
return jsonify(ci_id=ci_id)
@ci.route("/<int:ci_id>", methods=["DELETE"])
@auth_with_key
def delete_ci(ci_id=None):
manager = CIManager()
manager.delete(ci_id)
return jsonify(message="ok")
@ci.route("/heartbeat/<string:ci_type>/<string:unique>", methods=["POST"])
def add_heartbeat(ci_type, unique):
if not unique or not ci_type:
return jsonify(message="error")
# return jsonify(message="ok")
return jsonify(message=CIManager().add_heartbeat(ci_type, unique))
@ci.route("/heartbeat", methods=["GET"])
def get_heartbeat():
page = get_page(request.values.get("page", 1))
ci_type = request.values.get("ci_type", "").strip()
try:
ci_type = CITypeCache.get(ci_type).type_id
except:
return jsonify(numfound=0, result=[])
agent_status = request.values.get("agent_status", None)
if agent_status:
agent_status = int(agent_status)
numfound, result = CIManager().get_heartbeat(page,
ci_type,
agent_status=agent_status)
return jsonify(numfound=numfound, result=result)