Skip to content

Commit ff9fb85

Browse files
committed
feat(api): calc all racks free u count
1 parent dc39197 commit ff9fb85

3 files changed

Lines changed: 45 additions & 11 deletions

File tree

cmdb-api/api/lib/cmdb/dcim/rack.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def update(cls, _id, **kwargs):
4444
CIManager().update(_id, _sync=True, **kwargs)
4545

4646
if RackBuiltinAttributes.U_COUNT in kwargs:
47-
payload = {RackBuiltinAttributes.FREE_U_COUNT: cls._calc_u_free_count(_id)}
47+
payload = {RackBuiltinAttributes.FREE_U_COUNT: cls.calc_u_free_count(_id)}
4848

4949
CIManager().update(_id, _sync=True, **payload)
5050

@@ -57,7 +57,7 @@ def delete(self, _id):
5757
CIManager().update(ci['_id'], **payload)
5858

5959
@staticmethod
60-
def _calc_u_free_count(rack_id, device_id=None, u_start=None, u_count=None):
60+
def calc_u_free_count(rack_id, device_id=None, u_start=None, u_count=None):
6161
rack = CIManager.get_ci_by_id(rack_id, need_children=False)
6262
if not rack.get(RackBuiltinAttributes.U_COUNT):
6363
return 0
@@ -123,7 +123,7 @@ def check_u_slot(self):
123123

124124
def add_device(self, rack_id, device_id, u_start, u_count=None):
125125
with (redis_lock.Lock(rd.r, "DCIM_RACK_OPERATE_{}".format(rack_id))):
126-
self._calc_u_free_count(rack_id, device_id, u_start, u_count)
126+
self.calc_u_free_count(rack_id, device_id, u_start, u_count)
127127

128128
self.add_relation(rack_id, device_id)
129129

@@ -133,7 +133,7 @@ def add_device(self, rack_id, device_id, u_start, u_count=None):
133133
CIManager().update(device_id, _sync=True, **payload)
134134

135135
payload = {
136-
RackBuiltinAttributes.FREE_U_COUNT: self._calc_u_free_count(rack_id, device_id, u_start, u_count)}
136+
RackBuiltinAttributes.FREE_U_COUNT: self.calc_u_free_count(rack_id, device_id, u_start, u_count)}
137137
CIManager().update(rack_id, _sync=True, **payload)
138138

139139
OperateHistoryManager().add(operate_type=OperateTypeEnum.ADD_DEVICE, rack_id=rack_id, ci_id=device_id)
@@ -142,7 +142,7 @@ def remove_device(self, rack_id, device_id):
142142
with (redis_lock.Lock(rd.r, "DCIM_RACK_OPERATE_{}".format(rack_id))):
143143
CIRelationManager.delete_3(rack_id, device_id, apply_async=False, valid=False)
144144

145-
payload = {RackBuiltinAttributes.FREE_U_COUNT: self._calc_u_free_count(rack_id)}
145+
payload = {RackBuiltinAttributes.FREE_U_COUNT: self.calc_u_free_count(rack_id)}
146146
CIManager().update(rack_id, _sync=True, **payload)
147147

148148
payload = {RackBuiltinAttributes.U_START: None}
@@ -152,7 +152,7 @@ def remove_device(self, rack_id, device_id):
152152

153153
def move_device(self, rack_id, device_id, to_u_start):
154154
with (redis_lock.Lock(rd.r, "DCIM_RACK_OPERATE_{}".format(rack_id))):
155-
payload = {RackBuiltinAttributes.FREE_U_COUNT: self._calc_u_free_count(rack_id, device_id, to_u_start)}
155+
payload = {RackBuiltinAttributes.FREE_U_COUNT: self.calc_u_free_count(rack_id, device_id, to_u_start)}
156156
CIManager().update(rack_id, _sync=True, **payload)
157157

158158
CIManager().update(device_id, _sync=True, **{RackBuiltinAttributes.U_START: to_u_start})
@@ -161,23 +161,22 @@ def move_device(self, rack_id, device_id, to_u_start):
161161

162162
def migrate_device(self, rack_id, device_id, to_rack_id, to_u_start):
163163
with (redis_lock.Lock(rd.r, "DCIM_RACK_OPERATE_{}".format(rack_id))):
164-
self._calc_u_free_count(to_rack_id, device_id, to_u_start)
164+
self.calc_u_free_count(to_rack_id, device_id, to_u_start)
165165

166166
if rack_id != to_rack_id:
167167
CIRelationManager.delete_3(rack_id, device_id, apply_async=False, valid=False)
168168

169169
self.add_relation(to_rack_id, device_id)
170170

171171
payload = {
172-
RackBuiltinAttributes.FREE_U_COUNT: self._calc_u_free_count(to_rack_id, device_id, to_u_start)}
172+
RackBuiltinAttributes.FREE_U_COUNT: self.calc_u_free_count(to_rack_id, device_id, to_u_start)}
173173
CIManager().update(to_rack_id, _sync=True, **payload)
174174

175175
CIManager().update(device_id, _sync=True, **{RackBuiltinAttributes.U_START: to_u_start})
176176

177177
if rack_id != to_rack_id:
178-
payload = {RackBuiltinAttributes.FREE_U_COUNT: self._calc_u_free_count(rack_id)}
178+
payload = {RackBuiltinAttributes.FREE_U_COUNT: self.calc_u_free_count(rack_id)}
179179
CIManager().update(rack_id, _sync=True, **payload)
180180

181181
OperateHistoryManager().add(operate_type=OperateTypeEnum.REMOVE_DEVICE, rack_id=rack_id, ci_id=device_id)
182182
OperateHistoryManager().add(operate_type=OperateTypeEnum.ADD_DEVICE, rack_id=to_rack_id, ci_id=device_id)
183-

cmdb-api/api/tasks/cmdb.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# -*- coding:utf-8 -*-
1+
# -*- coding:utf-8 -*-
22

33

44
import datetime
@@ -374,3 +374,25 @@ def build_relations_for_ad_accept(adc, ci_id, ad_key2attr):
374374
source=RelationSourceEnum.AUTO_DISCOVERY)
375375
except:
376376
pass
377+
378+
379+
@celery.task(name="cmdb.dcim_calc_u_free_count", queue=CMDB_QUEUE)
380+
@reconnect_db
381+
def dcim_calc_u_free_count():
382+
from api.lib.cmdb.ci import CIManager
383+
from api.lib.cmdb.dcim.rack import RackManager
384+
from api.lib.cmdb.dcim.const import RackBuiltinAttributes
385+
386+
if not has_request_context():
387+
current_app.test_request_context().push()
388+
login_user(UserCache.get('worker'))
389+
390+
try:
391+
rack_m = RackManager()
392+
except Exception:
393+
return
394+
395+
racks = CI.get_by(type_id=rack_m.type_id, to_dict=False)
396+
for rack in racks:
397+
payload = {RackBuiltinAttributes.FREE_U_COUNT: rack_m.calc_u_free_count(rack.id)}
398+
CIManager().update(rack.id, **payload)

cmdb-api/api/views/cmdb/dcim/rack.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
from flask import request
44

5+
from api.lib.cmdb.const import CMDB_QUEUE
56
from api.lib.cmdb.dcim.const import RackBuiltinAttributes
67
from api.lib.cmdb.dcim.rack import RackManager
78
from api.lib.common_setting.decorator import perms_role_required
89
from api.lib.common_setting.role_perm_base import CMDBApp
910
from api.lib.decorator import args_required
1011
from api.resource import APIView
12+
from api.tasks.cmdb import dcim_calc_u_free_count
1113

1214
app_cli = CMDBApp()
1315

@@ -87,3 +89,14 @@ def put(self, rack_id, device_id):
8789
device_id=device_id,
8890
to_u_start=to_u_start,
8991
to_rack_id=to_rack_id)
92+
93+
94+
class RackCalcUFreeCountView(APIView):
95+
url_prefix = ("/dcim/rack/calc_u_free_count",)
96+
97+
@perms_role_required(app_cli.app_name, app_cli.resource_type_name, app_cli.op.DCIM,
98+
app_cli.op.read, app_cli.admin_name)
99+
def post(self):
100+
dcim_calc_u_free_count.apply_async(queue=CMDB_QUEUE)
101+
102+
return self.jsonify(code=200)

0 commit comments

Comments
 (0)