add.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # Copyright: (c) OpenSpug Organization. https://github.com/openspug/spug
  2. # Copyright: (c) <spug.dev@gmail.com>
  3. # Released under the AGPL-3.0 License.
  4. from libs import json_response, JsonParser, Argument
  5. from apps.host.models import Host, HostExtend, Group
  6. from apps.host import utils
  7. import json
  8. def get_regions(request):
  9. form, error = JsonParser(
  10. Argument('type', filter=lambda x: x in ('ali', 'tencent'), help='参数错误'),
  11. Argument('ak', help='请输入AccessKey ID'),
  12. Argument('ac', help='请输入AccessKey Secret'),
  13. ).parse(request.GET)
  14. if error is None:
  15. response = []
  16. if form.type == 'ali':
  17. for item in utils.fetch_ali_regions(form.ak, form.ac):
  18. response.append({'id': item['RegionId'], 'name': item['LocalName']})
  19. else:
  20. for item in utils.fetch_tencent_regions(form.ak, form.ac):
  21. response.append({'id': item['Region'], 'name': item['RegionName']})
  22. return json_response(response)
  23. return json_response(error=error)
  24. def cloud_import(request):
  25. form, error = JsonParser(
  26. Argument('type', filter=lambda x: x in ('ali', 'tencent'), help='参数错误'),
  27. Argument('ak', help='请输入AccessKey ID'),
  28. Argument('ac', help='请输入AccessKey Secret'),
  29. Argument('region_id', help='请选择区域'),
  30. Argument('group_id', type=int, help='请选择分组'),
  31. Argument('username', help='请输入默认SSH用户名'),
  32. Argument('port', type=int, help='请输入默认SSH端口号'),
  33. Argument('host_type', filter=lambda x: x in ('public', 'private'), help='请选择连接地址'),
  34. ).parse(request.body)
  35. if error is None:
  36. group = Group.objects.filter(pk=form.group_id).first()
  37. if not group:
  38. return json_response(error='未找到指定分组')
  39. if form.type == 'ali':
  40. instances = utils.fetch_ali_instances(form.ak, form.ac, form.region_id)
  41. else:
  42. instances = utils.fetch_tencent_instances(form.ak, form.ac, form.region_id)
  43. host_add_ids = []
  44. for item in instances:
  45. instance_id = item['instance_id']
  46. host_name = item.pop('instance_name')
  47. public_ips = item['public_ip_address'] or []
  48. private_ips = item['private_ip_address'] or []
  49. item['public_ip_address'] = json.dumps(public_ips)
  50. item['private_ip_address'] = json.dumps(private_ips)
  51. if HostExtend.objects.filter(instance_id=instance_id).exists():
  52. HostExtend.objects.filter(instance_id=instance_id).update(**item)
  53. else:
  54. if form.host_type == 'public':
  55. hostname = public_ips[0] if public_ips else ''
  56. else:
  57. hostname = private_ips[0] if private_ips else ''
  58. host = Host.objects.create(
  59. name=host_name,
  60. hostname=hostname,
  61. port=form.port,
  62. username=form.username,
  63. created_by=request.user)
  64. HostExtend.objects.create(host=host, **item)
  65. host_add_ids.append(host.id)
  66. if host_add_ids:
  67. group.hosts.add(*host_add_ids)
  68. return json_response(len(instances))
  69. return json_response(error=error)