mirror of https://github.com/veops/cmdb.git
relation view [done]
This commit is contained in:
parent
e351c7cf36
commit
92c163971c
|
@ -231,9 +231,11 @@ class CIManager(object):
|
||||||
item.delete()
|
item.delete()
|
||||||
|
|
||||||
for item in CIRelation.get_by(first_ci_id=ci_id, to_dict=False):
|
for item in CIRelation.get_by(first_ci_id=ci_id, to_dict=False):
|
||||||
|
ci_relation_delete.apply_async(args=(item.first_ci_id, item.second_ci_id), queue=CMDB_QUEUE)
|
||||||
item.delete()
|
item.delete()
|
||||||
|
|
||||||
for item in CIRelation.get_by(second_ci_id=ci_id, to_dict=False):
|
for item in CIRelation.get_by(second_ci_id=ci_id, to_dict=False):
|
||||||
|
ci_relation_delete.apply_async(args=(item.first_ci_id, item.second_ci_id), queue=CMDB_QUEUE)
|
||||||
item.delete()
|
item.delete()
|
||||||
|
|
||||||
ci.delete() # TODO: soft delete
|
ci.delete() # TODO: soft delete
|
||||||
|
|
|
@ -28,9 +28,10 @@ class Search(object):
|
||||||
|
|
||||||
def search(self):
|
def search(self):
|
||||||
ci = CI.get_by_id(self.root_id) or abort(404, "CI <{0}> does not exist".format(self.root_id))
|
ci = CI.get_by_id(self.root_id) or abort(404, "CI <{0}> does not exist".format(self.root_id))
|
||||||
ids = [self.root_id]
|
ids = [self.root_id] if not isinstance(self.root_id, list) else self.root_id
|
||||||
for _ in range(0, self.level):
|
for _ in range(0, self.level):
|
||||||
_tmp = list(map(json.loads, filter(lambda x: x is not None, rd.get(ids, REDIS_PREFIX_CI_RELATION))))
|
print(rd.get(ids, REDIS_PREFIX_CI_RELATION))
|
||||||
|
_tmp = list(map(json.loads, filter(lambda x: x is not None, rd.get(ids, REDIS_PREFIX_CI_RELATION) or [])))
|
||||||
ids = [j for i in _tmp for j in i]
|
ids = [j for i in _tmp for j in i]
|
||||||
if not self.orig_query or ("_type:" not in self.orig_query
|
if not self.orig_query or ("_type:" not in self.orig_query
|
||||||
and "type_id:" not in self.orig_query
|
and "type_id:" not in self.orig_query
|
||||||
|
@ -38,6 +39,10 @@ class Search(object):
|
||||||
type_ids = CITypeRelationManager.get_child_type_ids(ci.type_id, self.level)
|
type_ids = CITypeRelationManager.get_child_type_ids(ci.type_id, self.level)
|
||||||
self.orig_query = "_type:({0}),{1}".format(";".join(list(map(str, type_ids))), self.orig_query)
|
self.orig_query = "_type:({0}),{1}".format(";".join(list(map(str, type_ids))), self.orig_query)
|
||||||
|
|
||||||
|
if not ids:
|
||||||
|
# cis, counter, total, self.page, numfound, facet_
|
||||||
|
return [], {}, 0, self.page, 0, {}
|
||||||
|
|
||||||
if current_app.config.get("USE_ES"):
|
if current_app.config.get("USE_ES"):
|
||||||
return SearchFromES(self.orig_query,
|
return SearchFromES(self.orig_query,
|
||||||
fl=self.fl,
|
fl=self.fl,
|
||||||
|
@ -54,3 +59,19 @@ class Search(object):
|
||||||
count=self.count,
|
count=self.count,
|
||||||
sort=self.sort,
|
sort=self.sort,
|
||||||
ci_ids=ids).search()
|
ci_ids=ids).search()
|
||||||
|
|
||||||
|
def statistics(self):
|
||||||
|
ids = [self.root_id] if not isinstance(self.root_id, list) else self.root_id
|
||||||
|
for l in range(0, self.level):
|
||||||
|
if l == 0:
|
||||||
|
_tmp = list(map(json.loads, [i or '[]' for i in rd.get(ids, REDIS_PREFIX_CI_RELATION) or []]))
|
||||||
|
else:
|
||||||
|
for idx, i in enumerate(_tmp):
|
||||||
|
if i:
|
||||||
|
__tmp = list(map(json.loads, filter(lambda x: x is not None,
|
||||||
|
rd.get(i, REDIS_PREFIX_CI_RELATION) or [])))
|
||||||
|
_tmp[idx] = [j for i in __tmp for j in i]
|
||||||
|
else:
|
||||||
|
_tmp[idx] = []
|
||||||
|
|
||||||
|
return {_id: len(_tmp[idx]) for idx, _id in enumerate(ids)}
|
||||||
|
|
|
@ -133,11 +133,22 @@ class ESHandler(object):
|
||||||
def update(self, ci_id, body):
|
def update(self, ci_id, body):
|
||||||
_id = self.get_index_id(ci_id)
|
_id = self.get_index_id(ci_id)
|
||||||
|
|
||||||
|
if _id:
|
||||||
return self.es.index(index=self.index, id=_id, body=body).get("_id")
|
return self.es.index(index=self.index, id=_id, body=body).get("_id")
|
||||||
|
|
||||||
def delete(self, ci_id):
|
def create_or_update(self, ci_id, body):
|
||||||
_id = self.get_index_id(ci_id)
|
try:
|
||||||
|
self.update(ci_id, body) or self.create(body)
|
||||||
|
except KeyError:
|
||||||
|
self.create(body)
|
||||||
|
|
||||||
|
def delete(self, ci_id):
|
||||||
|
try:
|
||||||
|
_id = self.get_index_id(ci_id)
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
|
||||||
|
if _id:
|
||||||
self.es.delete(index=self.index, id=_id)
|
self.es.delete(index=self.index, id=_id)
|
||||||
|
|
||||||
def read(self, query, filter_path=None):
|
def read(self, query, filter_path=None):
|
||||||
|
|
|
@ -18,13 +18,13 @@ from api.lib.cmdb.const import REDIS_PREFIX_CI_RELATION
|
||||||
|
|
||||||
@celery.task(name="cmdb.ci_cache", queue=CMDB_QUEUE)
|
@celery.task(name="cmdb.ci_cache", queue=CMDB_QUEUE)
|
||||||
def ci_cache(ci_id):
|
def ci_cache(ci_id):
|
||||||
time.sleep(0.1)
|
time.sleep(0.01)
|
||||||
db.session.close()
|
db.session.close()
|
||||||
|
|
||||||
m = api.lib.cmdb.ci.CIManager()
|
m = api.lib.cmdb.ci.CIManager()
|
||||||
ci = m.get_ci_by_id_from_db(ci_id, need_children=False, use_master=False)
|
ci = m.get_ci_by_id_from_db(ci_id, need_children=False, use_master=False)
|
||||||
if current_app.config.get("USE_ES"):
|
if current_app.config.get("USE_ES"):
|
||||||
es.update(ci_id, ci)
|
es.create_or_update(ci_id, ci)
|
||||||
else:
|
else:
|
||||||
rd.create_or_update({ci_id: json.dumps(ci)}, REDIS_PREFIX_CI)
|
rd.create_or_update({ci_id: json.dumps(ci)}, REDIS_PREFIX_CI)
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,25 @@ class CIRelationSearchView(APIView):
|
||||||
result=response)
|
result=response)
|
||||||
|
|
||||||
|
|
||||||
|
class CIRelationStatisticsView(APIView):
|
||||||
|
url_prefix = "/ci_relations/statistics"
|
||||||
|
|
||||||
|
@auth_abandoned
|
||||||
|
def get(self):
|
||||||
|
root_ids = list(map(int, handle_arg_list(request.values.get('root_ids'))))
|
||||||
|
level = request.values.get('level', 1)
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
s = Search(root_ids, level)
|
||||||
|
try:
|
||||||
|
result = s.statistics()
|
||||||
|
except SearchError as e:
|
||||||
|
return abort(400, str(e))
|
||||||
|
current_app.logger.debug("search time is :{0}".format(time.time() - start))
|
||||||
|
|
||||||
|
return self.jsonify(result)
|
||||||
|
|
||||||
|
|
||||||
class GetSecondCIsView(APIView):
|
class GetSecondCIsView(APIView):
|
||||||
url_prefix = "/ci_relations/<int:first_ci_id>/second_cis"
|
url_prefix = "/ci_relations/<int:first_ci_id>/second_cis"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue