deployment.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/usr/bin/env python
  2. '''Deploy docker-ci report container on Digital Ocean.
  3. Usage:
  4. export CONFIG_JSON='
  5. { "DROPLET_NAME": "Digital_Ocean_dropplet_name",
  6. "DO_CLIENT_ID": "Digital_Ocean_client_id",
  7. "DO_API_KEY": "Digital_Ocean_api_key",
  8. "DOCKER_KEY_ID": "Digital_Ocean_ssh_key_id",
  9. "DOCKER_CI_KEY_PATH": "docker-ci_private_key_path",
  10. "DOCKER_CI_PUB": "$(cat docker-ci_ssh_public_key.pub)",
  11. "DOCKER_CI_ADDRESS" "user@docker-ci_fqdn_server",
  12. "SMTP_USER": "SMTP_server_user",
  13. "SMTP_PWD": "SMTP_server_password",
  14. "EMAIL_SENDER": "Buildbot_mailing_sender",
  15. "EMAIL_RCP": "Buildbot_mailing_receipient" }'
  16. python deployment.py
  17. '''
  18. import re, json, requests, base64
  19. from fabric import api
  20. from fabric.api import cd, run, put, sudo
  21. from os import environ as env
  22. from time import sleep
  23. from datetime import datetime
  24. # Populate environment variables
  25. CONFIG = json.loads(env['CONFIG_JSON'])
  26. for key in CONFIG:
  27. env[key] = CONFIG[key]
  28. # Load DOCKER_CI_KEY
  29. env['DOCKER_CI_KEY'] = open(env['DOCKER_CI_KEY_PATH']).read()
  30. DROPLET_NAME = env.get('DROPLET_NAME','report')
  31. TIMEOUT = 120 # Seconds before timeout droplet creation
  32. IMAGE_ID = 1004145 # Docker on Ubuntu 13.04
  33. REGION_ID = 4 # New York 2
  34. SIZE_ID = 66 # memory 512MB
  35. DO_IMAGE_USER = 'root' # Image user on Digital Ocean
  36. API_URL = 'https://api.digitalocean.com/'
  37. class digital_ocean():
  38. def __init__(self, key, client):
  39. '''Set default API parameters'''
  40. self.key = key
  41. self.client = client
  42. self.api_url = API_URL
  43. def api(self, cmd_path, api_arg={}):
  44. '''Make api call'''
  45. api_arg.update({'api_key':self.key, 'client_id':self.client})
  46. resp = requests.get(self.api_url + cmd_path, params=api_arg).text
  47. resp = json.loads(resp)
  48. if resp['status'] != 'OK':
  49. raise Exception(resp['error_message'])
  50. return resp
  51. def droplet_data(self, name):
  52. '''Get droplet data'''
  53. data = self.api('droplets')
  54. data = [droplet for droplet in data['droplets']
  55. if droplet['name'] == name]
  56. return data[0] if data else {}
  57. def json_fmt(data):
  58. '''Format json output'''
  59. return json.dumps(data, sort_keys = True, indent = 2)
  60. do = digital_ocean(env['DO_API_KEY'], env['DO_CLIENT_ID'])
  61. # Get DROPLET_NAME data
  62. data = do.droplet_data(DROPLET_NAME)
  63. # Stop processing if DROPLET_NAME exists on Digital Ocean
  64. if data:
  65. print ('Droplet: {} already deployed. Not further processing.'
  66. .format(DROPLET_NAME))
  67. exit(1)
  68. # Create droplet
  69. do.api('droplets/new', {'name':DROPLET_NAME, 'region_id':REGION_ID,
  70. 'image_id':IMAGE_ID, 'size_id':SIZE_ID,
  71. 'ssh_key_ids':[env['DOCKER_KEY_ID']]})
  72. # Wait for droplet to be created.
  73. start_time = datetime.now()
  74. while (data.get('status','') != 'active' and (
  75. datetime.now()-start_time).seconds < TIMEOUT):
  76. data = do.droplet_data(DROPLET_NAME)
  77. print data['status']
  78. sleep(3)
  79. # Wait for the machine to boot
  80. sleep(15)
  81. # Get droplet IP
  82. ip = str(data['ip_address'])
  83. print 'droplet: {} ip: {}'.format(DROPLET_NAME, ip)
  84. api.env.host_string = ip
  85. api.env.user = DO_IMAGE_USER
  86. api.env.key_filename = env['DOCKER_CI_KEY_PATH']
  87. # Correct timezone
  88. sudo('echo "America/Los_Angeles" >/etc/timezone')
  89. sudo('dpkg-reconfigure --frontend noninteractive tzdata')
  90. # Load JSON_CONFIG environment for Dockerfile
  91. CONFIG_JSON= base64.b64encode(
  92. '{{"DOCKER_CI_PUB": "{DOCKER_CI_PUB}",'
  93. ' "DOCKER_CI_KEY": "{DOCKER_CI_KEY}",'
  94. ' "DOCKER_CI_ADDRESS": "{DOCKER_CI_ADDRESS}",'
  95. ' "SMTP_USER": "{SMTP_USER}",'
  96. ' "SMTP_PWD": "{SMTP_PWD}",'
  97. ' "EMAIL_SENDER": "{EMAIL_SENDER}",'
  98. ' "EMAIL_RCP": "{EMAIL_RCP}"}}'.format(**env))
  99. run('mkdir -p /data/report')
  100. put('./', '/data/report')
  101. with cd('/data/report'):
  102. run('chmod 700 report.py')
  103. run('echo "{}" > credentials.json'.format(CONFIG_JSON))
  104. run('docker build -t report .')
  105. run('rm credentials.json')
  106. run("echo -e '30 09 * * * /usr/bin/docker run report\n' |"
  107. " /usr/bin/crontab -")