vlan.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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 Utils, Guest
  8. from jimvc.models import Rules
  9. from jimvc.models import VLAN
  10. from jimvc.models import Host
  11. from base import Base
  12. __author__ = 'James Iter'
  13. __date__ = '2019-03-12'
  14. __contact__ = 'james.iter.cn@gmail.com'
  15. __copyright__ = '(c) 2019 by James Iter.'
  16. blueprint = Blueprint(
  17. 'api_vlan',
  18. __name__,
  19. url_prefix='/api/vlan'
  20. )
  21. blueprints = Blueprint(
  22. 'api_vlans',
  23. __name__,
  24. url_prefix='/api/vlans'
  25. )
  26. vlan_base = Base(the_class=VLAN, the_blueprint=blueprint, the_blueprints=blueprints)
  27. @Utils.dumps2response
  28. def r_create():
  29. args_rules = [
  30. Rules.VLAN_ID.value,
  31. Rules.LABEL.value,
  32. Rules.DESCRIPTION.value
  33. ]
  34. vlan = VLAN()
  35. vlan.vlan_id = request.json.get('vlan_id')
  36. vlan.label = request.json.get('label')
  37. vlan.description = request.json.get('description', '')
  38. try:
  39. ji.Check.previewing(args_rules, vlan.__dict__)
  40. ret = dict()
  41. ret['state'] = ji.Common.exchange_state(20000)
  42. if vlan.exist_by('vlan_id'):
  43. ret['state'] = ji.Common.exchange_state(40901)
  44. ret['state']['sub']['zh-cn'] = ''.join([ret['state']['sub']['zh-cn'], u': Vlan ID: ', str(vlan.vlan_id)])
  45. return ret
  46. vlan.create()
  47. vlan.get()
  48. # 取全部活着的 hosts
  49. available_hosts = Host.get_available_hosts(nonrandom=None)
  50. for host in available_hosts:
  51. message = {
  52. '_object': 'vlan',
  53. 'action': 'create',
  54. 'uuid': None,
  55. 'node_id': host['node_id'],
  56. 'vlan_id': vlan.vlan_id,
  57. 'passback_parameters': {'vlan_id': vlan.vlan_id}
  58. }
  59. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  60. ret['data'] = vlan.__dict__
  61. return ret
  62. except ji.PreviewingError, e:
  63. return json.loads(e.message)
  64. @Utils.dumps2response
  65. def r_update(ids):
  66. ret = dict()
  67. ret['state'] = ji.Common.exchange_state(20000)
  68. ret['data'] = list()
  69. args_rules = [
  70. Rules.IDS.value
  71. ]
  72. if 'label' in request.json:
  73. args_rules.append(
  74. Rules.LABEL.value,
  75. )
  76. if 'description' in request.json:
  77. args_rules.append(
  78. Rules.DESCRIPTION.value,
  79. )
  80. if args_rules.__len__() < 2:
  81. return ret
  82. request.json['ids'] = ids
  83. try:
  84. ji.Check.previewing(args_rules, request.json)
  85. vlan = VLAN()
  86. # 检测所指定的 vlan 都存在
  87. for _id in ids.split(','):
  88. vlan.id = _id
  89. vlan.get()
  90. for _id in ids.split(','):
  91. vlan.id = _id
  92. vlan.get()
  93. vlan.label = request.json.get('label', vlan.label)
  94. vlan.description = request.json.get('description', vlan.description)
  95. vlan.update()
  96. vlan.get()
  97. ret['data'].append(vlan.__dict__)
  98. return ret
  99. except ji.PreviewingError, e:
  100. return json.loads(e.message)
  101. @Utils.dumps2response
  102. def r_get(ids):
  103. ret = vlan_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  104. if '200' != ret['state']['code']:
  105. return ret
  106. hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
  107. hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
  108. hosts_ret = json.loads(hosts_ret.content)
  109. hosts_mapping_by_vlan_bridge = dict()
  110. for vlan in ret['data']:
  111. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  112. vlan_bond_name = 'bond0.' + vlan['vlan_id'].__str__()
  113. if vlan_bridge_name not in hosts_mapping_by_vlan_bridge:
  114. hosts_mapping_by_vlan_bridge[vlan_bridge_name] = list()
  115. for host in hosts_ret['data']:
  116. if vlan_bridge_name in host['vlans'] and vlan_bond_name in host['vlans']:
  117. hosts_mapping_by_vlan_bridge[vlan_bridge_name].append(host)
  118. hosts = hosts_ret['data']
  119. posts = hosts.__len__()
  120. for i, vlan in enumerate(ret['data']):
  121. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  122. ret['data'][i]['posts'] = posts
  123. ret['data'][i]['arrival'] = hosts_mapping_by_vlan_bridge[vlan_bridge_name].__len__()
  124. return ret
  125. @Utils.dumps2response
  126. def r_get_by_filter():
  127. ret = vlan_base.get_by_filter()
  128. if '200' != ret['state']['code']:
  129. return ret
  130. hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
  131. hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
  132. hosts_ret = json.loads(hosts_ret.content)
  133. hosts_mapping_by_vlan_bridge = dict()
  134. for vlan in ret['data']:
  135. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  136. vlan_bond_name = 'bond0.' + vlan['vlan_id'].__str__()
  137. if vlan_bridge_name not in hosts_mapping_by_vlan_bridge:
  138. hosts_mapping_by_vlan_bridge[vlan_bridge_name] = list()
  139. for host in hosts_ret['data']:
  140. if vlan_bridge_name in host['vlans'] and vlan_bond_name in host['vlans']:
  141. hosts_mapping_by_vlan_bridge[vlan_bridge_name].append(host)
  142. hosts = hosts_ret['data']
  143. posts = hosts.__len__()
  144. for i, vlan in enumerate(ret['data']):
  145. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  146. ret['data'][i]['posts'] = posts
  147. ret['data'][i]['arrival'] = hosts_mapping_by_vlan_bridge[vlan_bridge_name].__len__()
  148. return ret
  149. @Utils.dumps2response
  150. def r_content_search():
  151. ret = vlan_base.content_search()
  152. if '200' != ret['state']['code']:
  153. return ret
  154. hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
  155. hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
  156. hosts_ret = json.loads(hosts_ret.content)
  157. hosts_mapping_by_vlan_bridge = dict()
  158. for vlan in ret['data']:
  159. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  160. vlan_bond_name = 'bond0.' + vlan['vlan_id'].__str__()
  161. if vlan_bridge_name not in hosts_mapping_by_vlan_bridge:
  162. hosts_mapping_by_vlan_bridge[vlan_bridge_name] = list()
  163. for host in hosts_ret['data']:
  164. if vlan_bridge_name in host['vlans'] and vlan_bond_name in host['vlans']:
  165. hosts_mapping_by_vlan_bridge[vlan_bridge_name].append(host)
  166. hosts = hosts_ret['data']
  167. posts = hosts.__len__()
  168. for i, vlan in enumerate(ret['data']):
  169. vlan_bridge_name = 'vlan' + vlan['vlan_id'].__str__()
  170. ret['data'][i]['posts'] = posts
  171. ret['data'][i]['arrival'] = hosts_mapping_by_vlan_bridge[vlan_bridge_name].__len__()
  172. return ret
  173. @Utils.dumps2response
  174. def r_delete(ids):
  175. ret = dict()
  176. ret['state'] = ji.Common.exchange_state(20000)
  177. args_rules = [
  178. Rules.IDS.value
  179. ]
  180. try:
  181. ji.Check.previewing(args_rules, {'ids': ids})
  182. vlan = VLAN()
  183. # 检测所指定的 vlan 都存在
  184. for _id in ids.split(','):
  185. vlan.id = _id
  186. vlan.get()
  187. guests, _ = Guest.get_by_filter(filter_str=':'.join(['vlan_id', 'eq', vlan.vlan_id.__str__()]))
  188. # 检测 vlan 中是否存在 虚拟机,若存在,则拒绝删除操作。
  189. if guests.__len__() > 0:
  190. guests_info = ''
  191. for guest in guests:
  192. guests_info += guest['label'] + ',' + guest['uuid'] + '.'
  193. ret['state'] = ji.Common.exchange_state(41262)
  194. ret['state']['sub']['zh-cn'] = ''.join([
  195. ret['state']['sub']['zh-cn'], u': Vlan ID: ', vlan.vlan_id, u': Guests: ', guests_info])
  196. return ret
  197. for _id in ids.split(','):
  198. vlan.id = _id
  199. vlan.get()
  200. # 取全部活着的 hosts
  201. available_hosts = Host.get_available_hosts(nonrandom=None)
  202. for host in available_hosts:
  203. message = {
  204. '_object': 'vlan',
  205. 'action': 'delete',
  206. 'uuid': None,
  207. 'node_id': host['node_id'],
  208. 'vlan_id': vlan.vlan_id,
  209. 'passback_parameters': {'id': vlan.id, 'vlan_id': vlan.vlan_id}
  210. }
  211. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  212. return ret
  213. except ji.PreviewingError, e:
  214. return json.loads(e.message)
  215. # return vlan_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')