From 85222443c0c4890938e85bd72351e5b86643a44c Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 29 Nov 2019 18:11:18 +0800 Subject: [PATCH] relation view [done] --- api/lib/cmdb/ci.py | 2 + api/lib/cmdb/search/ci_relation/search.py | 25 +++- api/lib/utils.py | 17 ++- api/tasks/cmdb.py | 4 +- api/views/cmdb/ci_relation.py | 19 +++ ui/src/api/cmdb/CIRelation.js | 15 +++ ui/src/views/cmdb/ci/index.vue | 30 +++-- .../cmdb/ci/modules/CreateInstanceForm.vue | 2 +- ui/src/views/cmdb/relation_views/index.vue | 125 +++++++++++++----- ui/src/views/cmdb/tree_views/index.vue | 24 +++- 10 files changed, 204 insertions(+), 59 deletions(-) diff --git a/api/lib/cmdb/ci.py b/api/lib/cmdb/ci.py index d0bb94e..e4ba129 100644 --- a/api/lib/cmdb/ci.py +++ b/api/lib/cmdb/ci.py @@ -231,9 +231,11 @@ class CIManager(object): item.delete() 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() 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() ci.delete() # TODO: soft delete diff --git a/api/lib/cmdb/search/ci_relation/search.py b/api/lib/cmdb/search/ci_relation/search.py index 6536a01..8713851 100644 --- a/api/lib/cmdb/search/ci_relation/search.py +++ b/api/lib/cmdb/search/ci_relation/search.py @@ -28,9 +28,10 @@ class Search(object): def search(self): 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): - _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] if not self.orig_query or ("_type:" 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) 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"): return SearchFromES(self.orig_query, fl=self.fl, @@ -54,3 +59,19 @@ class Search(object): count=self.count, sort=self.sort, 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)} diff --git a/api/lib/utils.py b/api/lib/utils.py index 9758186..4aa3b7b 100644 --- a/api/lib/utils.py +++ b/api/lib/utils.py @@ -133,12 +133,23 @@ class ESHandler(object): def update(self, ci_id, body): _id = self.get_index_id(ci_id) - return self.es.index(index=self.index, id=_id, body=body).get("_id") + if _id: + return self.es.index(index=self.index, id=_id, body=body).get("_id") + + def create_or_update(self, ci_id, body): + try: + self.update(ci_id, body) or self.create(body) + except KeyError: + self.create(body) def delete(self, ci_id): - _id = self.get_index_id(ci_id) + try: + _id = self.get_index_id(ci_id) + except KeyError: + return - self.es.delete(index=self.index, id=_id) + if _id: + self.es.delete(index=self.index, id=_id) def read(self, query, filter_path=None): filter_path = filter_path or [] diff --git a/api/tasks/cmdb.py b/api/tasks/cmdb.py index 549edfd..1c30925 100644 --- a/api/tasks/cmdb.py +++ b/api/tasks/cmdb.py @@ -18,13 +18,13 @@ from api.lib.cmdb.const import REDIS_PREFIX_CI_RELATION @celery.task(name="cmdb.ci_cache", queue=CMDB_QUEUE) def ci_cache(ci_id): - time.sleep(0.1) + time.sleep(0.01) db.session.close() m = api.lib.cmdb.ci.CIManager() ci = m.get_ci_by_id_from_db(ci_id, need_children=False, use_master=False) if current_app.config.get("USE_ES"): - es.update(ci_id, ci) + es.create_or_update(ci_id, ci) else: rd.create_or_update({ci_id: json.dumps(ci)}, REDIS_PREFIX_CI) diff --git a/api/views/cmdb/ci_relation.py b/api/views/cmdb/ci_relation.py index 98918ef..65b4d62 100644 --- a/api/views/cmdb/ci_relation.py +++ b/api/views/cmdb/ci_relation.py @@ -57,6 +57,25 @@ class CIRelationSearchView(APIView): 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): url_prefix = "/ci_relations//second_cis" diff --git a/ui/src/api/cmdb/CIRelation.js b/ui/src/api/cmdb/CIRelation.js index d1e1ed6..7401173 100644 --- a/ui/src/api/cmdb/CIRelation.js +++ b/ui/src/api/cmdb/CIRelation.js @@ -13,3 +13,18 @@ export function getSecondCIs (ciId) { method: 'GET' }) } + +export function searchCIRelation (params) { + return axios({ + url: `/v0.1/ci_relations/s?${params}`, + method: 'GET' + }) +} + +export function statisticsCIRelation (params) { + return axios({ + url: '/v0.1/ci_relations/statistics', + method: 'GET', + params: params + }) +} diff --git a/ui/src/views/cmdb/ci/index.vue b/ui/src/views/cmdb/ci/index.vue index 39f6daf..5bed438 100644 --- a/ui/src/views/cmdb/ci/index.vue +++ b/ui/src/views/cmdb/ci/index.vue @@ -70,7 +70,7 @@ - + @@ -159,9 +159,11 @@ export default { result.totalPage = Math.ceil(res.numfound / params.pageSize) result.data = Object.assign([], res.result) result.data.forEach((item, index) => (item.key = item.ci_id)) - setTimeout(() => { - this.setColumnWidth() - }, 200) + if (res.numfound) { + setTimeout(() => { + this.setColumnWidth() + }, 200) + } this.instanceList = result.data return result }) @@ -365,7 +367,9 @@ export default { that.$refs.create.visible = false that.$refs.table.clearSelected() - that.$refs.table.refresh(true) + setTimeout(() => { + that.$refs.table.refresh(true) + }, 1000) that.reload() }) .catch(e => { @@ -374,7 +378,9 @@ export default { notification.error({ message: e.response.data.message }) - that.$refs.table.refresh(true) + setTimeout(() => { + that.$refs.table.refresh(true) + }, 1000) }) } }) @@ -399,7 +405,9 @@ export default { message: '删除成功' }) that.$refs.table.clearSelected() - that.$refs.table.refresh(true) + setTimeout(() => { + that.$refs.table.refresh(true) + }, 1000) }) .catch(e => { console.log(e) @@ -407,7 +415,9 @@ export default { notification.error({ message: e.response.data.message }) - that.$refs.table.refresh(true) + setTimeout(() => { + that.$refs.table.refresh(true) + }, 1000) }) } }) @@ -420,7 +430,9 @@ export default { onOk () { deleteCI(record.key) .then(res => { - that.$refs.table.refresh(true) + setTimeout(() => { + that.$refs.table.refresh(true) + }, 1000) }) .catch(e => { console.log(e) diff --git a/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue b/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue index 5d148c2..0a46b20 100644 --- a/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue +++ b/ui/src/views/cmdb/ci/modules/CreateInstanceForm.vue @@ -3,7 +3,7 @@ diff --git a/ui/src/views/cmdb/relation_views/index.vue b/ui/src/views/cmdb/relation_views/index.vue index c7cb06f..5edc5fa 100644 --- a/ui/src/views/cmdb/relation_views/index.vue +++ b/ui/src/views/cmdb/relation_views/index.vue @@ -7,7 +7,7 @@ >{{ item[0] }} - +