vlan.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import requests
  4. from flask import Blueprint, request, url_for
  5. import json
  6. import jimit as ji
  7. from jimvc.models import Config
  8. from jimvc.models import Utils, Guest
  9. from jimvc.models import Rules
  10. from jimvc.models import VLAN
  11. from jimvc.models import Host
  12. from base import Base
  13. __author__ = 'James Iter'
  14. __date__ = '2019-03-12'
  15. __contact__ = 'james.iter.cn@gmail.com'
  16. __copyright__ = '(c) 2019 by James Iter.'
  17. blueprint = Blueprint(
  18. 'api_vlan',
  19. __name__,
  20. url_prefix='/api/vlan'
  21. )
  22. blueprints = Blueprint(
  23. 'api_vlans',
  24. __name__,
  25. url_prefix='/api/vlans'
  26. )
  27. vlan_base = Base(the_class=VLAN, the_blueprint=blueprint, the_blueprints=blueprints)
  28. @Utils.dumps2response
  29. def r_create():
  30. args_rules = [
  31. Rules.VLAN_ID.value,
  32. Rules.LABEL.value,
  33. Rules.DESCRIPTION.value
  34. ]
  35. vlan = VLAN()
  36. vlan.vlan_id = request.json.get('vlan_id')
  37. vlan.label = request.json.get('label')
  38. vlan.description = request.json.get('description', '')
  39. try:
  40. ji.Check.previewing(args_rules, vlan.__dict__)
  41. ret = dict()
  42. ret['state'] = ji.Common.exchange_state(20000)
  43. if vlan.exist_by('vlan_id'):
  44. ret['state'] = ji.Common.exchange_state(40901)
  45. ret['state']['sub']['zh-cn'] = ''.join([ret['state']['sub']['zh-cn'], u': Vlan ID: ', str(vlan.vlan_id)])
  46. return ret
  47. vlan.create()
  48. vlan.get()
  49. # 取全部活着的 hosts
  50. available_hosts = Host.get_available_hosts(nonrandom=None)
  51. for host in available_hosts:
  52. message = {
  53. '_object': 'vlan',
  54. 'action': 'create',
  55. 'uuid': None,
  56. 'node_id': host['node_id'],
  57. 'vlan_id': vlan.vlan_id,
  58. 'passback_parameters': {'vlan_id': vlan.vlan_id}
  59. }
  60. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  61. ret['data'] = vlan.__dict__
  62. return ret
  63. except ji.PreviewingError, e:
  64. return json.loads(e.message)
  65. @Utils.dumps2response
  66. def r_update(ids):
  67. ret = dict()
  68. ret['state'] = ji.Common.exchange_state(20000)
  69. ret['data'] = list()
  70. args_rules = [
  71. Rules.IDS.value
  72. ]
  73. if 'label' in request.json:
  74. args_rules.append(
  75. Rules.LABEL.value,
  76. )
  77. if 'description' in request.json:
  78. args_rules.append(
  79. Rules.DESCRIPTION.value,
  80. )
  81. if args_rules.__len__() < 2:
  82. return ret
  83. request.json['ids'] = ids
  84. try:
  85. ji.Check.previewing(args_rules, request.json)
  86. vlan = VLAN()
  87. # 检测所指定的 vlan 都存在
  88. for _id in ids.split(','):
  89. vlan.id = _id
  90. vlan.get()
  91. for _id in ids.split(','):
  92. vlan.id = _id
  93. vlan.get()
  94. vlan.label = request.json.get('label', vlan.label)
  95. vlan.description = request.json.get('description', vlan.description)
  96. vlan.update()
  97. vlan.get()
  98. ret['data'].append(vlan.__dict__)
  99. return ret
  100. except ji.PreviewingError, e:
  101. return json.loads(e.message)
  102. @Utils.dumps2response
  103. def r_get(ids):
  104. ret = vlan_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  105. if '200' != ret['state']['code']:
  106. return ret
  107. config = Config()
  108. config.id = 1
  109. config.get()
  110. default_bridge = VLAN()
  111. default_bridge.id = 0
  112. default_bridge.vlan_id = -1
  113. default_bridge.label = u'默认网桥'
  114. default_bridge.description = u'系统初始化时的默认网桥。在系统中可见为:' + config.vm_network + u'。'
  115. default_bridge.create_time = 0
  116. ret['data'].insert(0, default_bridge.__dict__)
  117. hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
  118. hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
  119. hosts_ret = json.loads(hosts_ret.content)
  120. hosts_mapping_by_vlan_bridge = dict()
  121. for vlan in ret['data']:
  122. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  123. vlan_bond_name = 'bond0.' + vlan['vlan_id'].__str__()
  124. if vlan_bridge_name not in hosts_mapping_by_vlan_bridge:
  125. hosts_mapping_by_vlan_bridge[vlan_bridge_name] = list()
  126. for host in hosts_ret['data']:
  127. if vlan_bridge_name in host['vlans'] and vlan_bond_name in host['vlans']:
  128. hosts_mapping_by_vlan_bridge[vlan_bridge_name].append(host)
  129. hosts = hosts_ret['data']
  130. posts = hosts.__len__()
  131. for i, vlan in enumerate(ret['data']):
  132. if ret['data'][i]['vlan_id'] == -1:
  133. ret['data'][i]['posts'] = posts
  134. ret['data'][i]['arrival'] = posts
  135. else:
  136. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  137. ret['data'][i]['posts'] = posts
  138. ret['data'][i]['arrival'] = hosts_mapping_by_vlan_bridge[vlan_bridge_name].__len__()
  139. return ret
  140. @Utils.dumps2response
  141. def r_get_by_filter():
  142. ret = vlan_base.get_by_filter()
  143. if '200' != ret['state']['code']:
  144. return ret
  145. config = Config()
  146. config.id = 1
  147. config.get()
  148. default_bridge = VLAN()
  149. default_bridge.id = 0
  150. default_bridge.vlan_id = -1
  151. default_bridge.label = u'默认网桥'
  152. default_bridge.description = u'系统初始化时的默认网桥。在系统中可见为:' + config.vm_network + u'。'
  153. default_bridge.create_time = 0
  154. ret['data'].insert(0, default_bridge.__dict__)
  155. hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
  156. hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
  157. hosts_ret = json.loads(hosts_ret.content)
  158. hosts_mapping_by_vlan_bridge = dict()
  159. for vlan in ret['data']:
  160. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  161. vlan_bond_name = 'bond0.' + vlan['vlan_id'].__str__()
  162. if vlan_bridge_name not in hosts_mapping_by_vlan_bridge:
  163. hosts_mapping_by_vlan_bridge[vlan_bridge_name] = list()
  164. for host in hosts_ret['data']:
  165. if vlan_bridge_name in host['vlans'] and vlan_bond_name in host['vlans']:
  166. hosts_mapping_by_vlan_bridge[vlan_bridge_name].append(host)
  167. hosts = hosts_ret['data']
  168. posts = hosts.__len__()
  169. for i, vlan in enumerate(ret['data']):
  170. if ret['data'][i]['vlan_id'] == -1:
  171. ret['data'][i]['posts'] = posts
  172. ret['data'][i]['arrival'] = posts
  173. else:
  174. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  175. ret['data'][i]['posts'] = posts
  176. ret['data'][i]['arrival'] = hosts_mapping_by_vlan_bridge[vlan_bridge_name].__len__()
  177. return ret
  178. @Utils.dumps2response
  179. def r_content_search():
  180. ret = vlan_base.content_search()
  181. if '200' != ret['state']['code']:
  182. return ret
  183. config = Config()
  184. config.id = 1
  185. config.get()
  186. default_bridge = VLAN()
  187. default_bridge.id = 0
  188. default_bridge.vlan_id = -1
  189. default_bridge.label = u'默认网桥'
  190. default_bridge.description = u'系统初始化时的默认网桥。在系统中可见为:' + config.vm_network + u'。'
  191. default_bridge.create_time = 0
  192. ret['data'].insert(0, default_bridge.__dict__)
  193. hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
  194. hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
  195. hosts_ret = json.loads(hosts_ret.content)
  196. hosts_mapping_by_vlan_bridge = dict()
  197. for vlan in ret['data']:
  198. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  199. vlan_bond_name = 'bond0.' + vlan['vlan_id'].__str__()
  200. if vlan_bridge_name not in hosts_mapping_by_vlan_bridge:
  201. hosts_mapping_by_vlan_bridge[vlan_bridge_name] = list()
  202. for host in hosts_ret['data']:
  203. if vlan_bridge_name in host['vlans'] and vlan_bond_name in host['vlans']:
  204. hosts_mapping_by_vlan_bridge[vlan_bridge_name].append(host)
  205. hosts = hosts_ret['data']
  206. posts = hosts.__len__()
  207. for i, vlan in enumerate(ret['data']):
  208. if ret['data'][i]['vlan_id'] == -1:
  209. ret['data'][i]['posts'] = posts
  210. ret['data'][i]['arrival'] = posts
  211. else:
  212. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  213. ret['data'][i]['posts'] = posts
  214. ret['data'][i]['arrival'] = hosts_mapping_by_vlan_bridge[vlan_bridge_name].__len__()
  215. return ret
  216. @Utils.dumps2response
  217. def r_delete(ids):
  218. ret = dict()
  219. ret['state'] = ji.Common.exchange_state(20000)
  220. args_rules = [
  221. Rules.IDS.value
  222. ]
  223. try:
  224. ji.Check.previewing(args_rules, {'ids': ids})
  225. vlan = VLAN()
  226. # 检测所指定的 vlan 都存在
  227. for _id in ids.split(','):
  228. vlan.id = _id
  229. vlan.get()
  230. guests, _ = Guest.get_by_filter(filter_str=':'.join(['vlan_id', 'eq', vlan.vlan_id.__str__()]))
  231. # 检测 vlan 中是否存在 虚拟机,若存在,则拒绝删除操作。
  232. if guests.__len__() > 0:
  233. guests_info = ''
  234. for guest in guests:
  235. guests_info += guest['label'] + ',' + guest['uuid'] + '.'
  236. ret['state'] = ji.Common.exchange_state(41262)
  237. ret['state']['sub']['zh-cn'] = ''.join([
  238. ret['state']['sub']['zh-cn'], u': Vlan ID: ', vlan.vlan_id, u': Guests: ', guests_info])
  239. return ret
  240. for _id in ids.split(','):
  241. vlan.id = _id
  242. vlan.get()
  243. # 取全部活着的 hosts
  244. available_hosts = Host.get_available_hosts(nonrandom=None)
  245. for host in available_hosts:
  246. message = {
  247. '_object': 'vlan',
  248. 'action': 'delete',
  249. 'uuid': None,
  250. 'node_id': host['node_id'],
  251. 'vlan_id': vlan.vlan_id,
  252. 'passback_parameters': {'id': vlan.id, 'vlan_id': vlan.vlan_id}
  253. }
  254. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  255. return ret
  256. except ji.PreviewingError, e:
  257. return json.loads(e.message)
  258. @Utils.dumps2response
  259. def r_force_delete(ids):
  260. args_rules = [
  261. Rules.IDS.value
  262. ]
  263. try:
  264. ji.Check.previewing(args_rules, {'ids': ids})
  265. vlan = VLAN()
  266. # 检测所指定的 vlan 都存在
  267. for _id in ids.split(','):
  268. vlan.id = _id
  269. vlan.get()
  270. guests, _ = Guest.get_by_filter(filter_str=':'.join(['vlan_id', 'eq', vlan.vlan_id.__str__()]))
  271. # 检测 vlan 中是否存在 虚拟机,若存在,则拒绝删除操作。
  272. if guests.__len__() > 0:
  273. guests_info = ''
  274. for guest in guests:
  275. guests_info += guest['label'] + ',' + guest['uuid'] + '.'
  276. ret = dict()
  277. ret['state'] = ji.Common.exchange_state(41262)
  278. ret['state']['sub']['zh-cn'] = ''.join([
  279. ret['state']['sub']['zh-cn'], u': Vlan ID: ', vlan.vlan_id, u': Guests: ', guests_info])
  280. return ret
  281. for _id in ids.split(','):
  282. vlan.id = _id
  283. vlan.get()
  284. # 取全部活着的 hosts
  285. available_hosts = Host.get_available_hosts(nonrandom=None)
  286. for host in available_hosts:
  287. message = {
  288. '_object': 'vlan',
  289. 'action': 'delete',
  290. 'uuid': None,
  291. 'node_id': host['node_id'],
  292. 'vlan_id': vlan.vlan_id,
  293. 'passback_parameters': {'id': vlan.id, 'vlan_id': vlan.vlan_id}
  294. }
  295. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  296. except ji.PreviewingError, e:
  297. return json.loads(e.message)
  298. return vlan_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')