config.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import jimit as ji
  5. from IPy import IP, intToIp
  6. from jimvc.models import app_config
  7. from jimvc.models import Database as db
  8. from jimvc.models import ORM
  9. from jimvc.models import status
  10. __author__ = 'James Iter'
  11. __date__ = '2017/3/21'
  12. __contact__ = 'james.iter.cn@gmail.com'
  13. __copyright__ = '(c) 2017 by James Iter.'
  14. class Config(ORM):
  15. _table_name = 'config'
  16. _primary_key = 'id'
  17. def __init__(self):
  18. super(Config, self).__init__()
  19. # 配置条目的 id 只会是 1
  20. self.id = 1
  21. self.jimv_edition = status.JimVEdition.standalone.value
  22. self.storage_mode = status.StorageMode.local.value
  23. self.dfs_volume = ''
  24. self.storage_path = ''
  25. self.vm_network = ''
  26. self.vm_manage_network = ''
  27. self.start_ip = ''
  28. self.end_ip = ''
  29. self.start_vnc_port = None
  30. self.netmask = ''
  31. self.gateway = ''
  32. self.dns1 = ''
  33. self.dns2 = ''
  34. self.iops_base = 0
  35. self.iops_pre_unit = 0
  36. self.iops_cap = 0
  37. self.iops_max = 0
  38. self.iops_max_length = 0
  39. self.bps_base = 0
  40. self.bps_pre_unit = 0
  41. self.bps_cap = 0
  42. self.bps_max = 0
  43. self.bps_max_length = 0
  44. @staticmethod
  45. def get_filter_keywords():
  46. return {}
  47. @staticmethod
  48. def get_allow_update_keywords():
  49. return []
  50. @staticmethod
  51. def get_allow_content_search_keywords():
  52. return []
  53. def check_ip(self):
  54. network_segment = IP(self.start_ip + '/' + self.netmask, make_net=True)
  55. ret = dict()
  56. # 起止IP必须在同一个网段中
  57. if IP(self.end_ip) not in network_segment:
  58. ret['state'] = ji.Common.exchange_state(41251)
  59. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  60. # 网关必须与将分配给Guest的IP,处于同一个网段中
  61. if IP(self.gateway) not in network_segment:
  62. ret['state'] = ji.Common.exchange_state(41252)
  63. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  64. # 网关不能是网络地址或广播地址
  65. if IP(self.gateway) in [network_segment[i] for i in (0, -1)]:
  66. ret['state'] = ji.Common.exchange_state(41253)
  67. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  68. # 当用户输入的起始IP为网络地址时,自动重置其为该网段中第一个可用IP
  69. if self.start_ip == network_segment[0].__str__():
  70. self.start_ip = intToIp((int(IP(self.start_ip).strDec()) + 1).__str__(), 4)
  71. # 当用户输入的结束IP为广播地址时,自动重置其为该网段中最后一个可用IP
  72. if self.end_ip == network_segment[-1].__str__():
  73. self.end_ip = intToIp((int(IP(self.end_ip).strDec()) - 1).__str__(), 4)
  74. # 起始的可用IP地址必须小于结束的可用IP地址
  75. if IP(self.start_ip) >= IP(self.end_ip):
  76. ret['state'] = ji.Common.exchange_state(41254)
  77. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  78. return True
  79. def generate_available_ip2set(self):
  80. # 删除现有的可用IP集合
  81. db.r.delete(app_config['ip_available_set'])
  82. for ip_dec in range(int(IP(self.start_ip).strDec()), int(IP(self.end_ip).strDec()) + 1):
  83. db.r.sadd(app_config['ip_available_set'], intToIp(ip_dec, 4))
  84. def generate_available_vnc_port(self):
  85. # 删除现有的可用 vnc 端口集合
  86. db.r.delete(app_config['vnc_port_available_set'])
  87. i = 0
  88. # 借用可用 IP 范围生成需要的 vnc 端口集合
  89. for ip_dec in range(int(IP(self.start_ip).strDec()), int(IP(self.end_ip).strDec()) + 1):
  90. i += 1
  91. db.r.sadd(app_config['vnc_port_available_set'], self.start_vnc_port + i)
  92. def update_global_config(self):
  93. db.r.hmset(app_config['global_config'], self.__dict__)