ftp_deploy.utils.deploy: 112 total statements, 94.9% covered

Generated: Sun 2014-03-16 19:26 GMT

Source file: /var/www/service.dev/service/ftp_deploy/utils/deploy.py

Stats: 94 executed, 5 missed, 13 excluded, 43 ignored

  1. import os
  2. import json
  3. from ftplib import FTP
  4. import tempfile
  5. import time
  6. from celery import task, current_task
  7. from ftp_deploy.conf import *
  8. from ftp_deploy.models import Log, Task
  9. from .core import LockError
  10. from .repo import commits_parser, repository_parser
  11. from .ftp import ftp_connection
  12. from .email import notification_success, notification_fail
  13. from .curl import curl_connection
  14. class Deploy(object):
  15. """Deploy method responsible for perform deploying"""
  16. def __init__(self, host, payload, service, task_name):
  17. self.host = host
  18. self.service = service
  19. self.task = Task.objects.get(name=task_name)
  20. self.data = json.loads(payload)
  21. self.json_string = payload
  22. self.files_count = commits_parser(self.data['commits'], self.service.repo_source).files_count()
  23. self.ftp_host = self.service.ftp_host
  24. self.ftp_username = self.service.ftp_username
  25. self.ftp_password = self.service.ftp_password
  26. self.ftp_path = self.service.ftp_path
  27. self.repo = repository_parser(self.data, self.service)
  28. self.repo_username, self.repo_password = self.repo.credentials()
  29. self.user = self.repo.deploy_name()
  30. def perform(self):
  31. """Perform ftp connection and choose repository perform method (bitbucket or github)"""
  32. if self.user == 'Restore':
  33. self.service.get_logs_tree().delete()
  34. self.log = Log()
  35. self.log.payload = self.json_string
  36. self.log.service = self.service
  37. self.log.save()
  38. try:
  39. self.ftp = ftp_connection(self.ftp_host, self.ftp_username, self.ftp_password, self.ftp_path)
  40. if self.service.lock():
  41. raise LockError()
  42. self.task.active = True
  43. self.task.save()
  44. self.ftp.connect()
  45. except LockError, e:
  46. self.set_fail('Service Locked', e)
  47. except Exception, e:
  48. self.set_fail('FTP Connection', e)
  49. else:
  50. try:
  51. if self.service.repo_source == 'bb':
  52. self.perform_bitbucket()
  53. if self.service.repo_source == 'gh':
  54. self.perform_github()
  55. except Exception, e:
  56. self.set_fail(self.user, e)
  57. else:
  58. self.log.user = self.user
  59. self.log.status = True
  60. self.log.save()
  61. notification_success(self.host, self.service, self.json_string)
  62. finally:
  63. self.ftp.quit()
  64. self.service.check()
  65. self.service.save()
  66. self.task.delete()
  67. def perform_bitbucket(self):
  68. """perform bitbucket deploy"""
  69. curl = curl_connection(self.repo_username, self.repo_password)
  70. curl.authenticate()
  71. i = 0
  72. for commit in self.data['commits']:
  73. for files in commit['files']:
  74. file_path = files['file']
  75. self.update_progress(i, file_path)
  76. i += 1
  77. if files['type'] == 'removed':
  78. self.ftp.remove_file(file_path)
  79. else:
  80. url = 'https://api.bitbucket.org/1.0/repositories%sraw/%s/%s' % (self.data['repository']['absolute_url'], commit['node'], file_path)
  81. url = str(url.encode('utf-8'))
  82. value = curl.perform(url)
  83. self.create_file(file_path, value)
  84. curl.close()
  85. def perform_github(self):
  86. curl = curl_connection(self.repo_username, self.repo_password)
  87. curl.authenticate()
  88. i = 0
  89. for commit in self.data['commits']:
  90. for file in commit['removed']:
  91. self.update_progress(i, file)
  92. i += 1
  93. self.ftp.remove_file(file)
  94. for file in commit['added'] + commit['modified']:
  95. self.update_progress(i, file)
  96. i += 1
  97. url = 'https://raw.github.com/%s/%s/%s/%s' % (self.data['repository']['owner']['name'], self.data['repository']['name'], commit['id'], file)
  98. url = str(url.encode('utf-8'))
  99. value = curl.perform(url)
  100. self.create_file(file, value)
  101. curl.close()
  102. def update_progress(self, i, file_path):
  103. progress_percent = int(100 * float(i) / float(self.files_count))
  104. current_task.update_state(state='PROGRESS', meta={'status': progress_percent, 'file': os.path.basename(file_path)})
  105. def create_file(self, file_path, value):
  106. temp_file = tempfile.NamedTemporaryFile(delete=False)
  107. temp_file.write(value)
  108. temp_file.close()
  109. temp_file = open(temp_file.name, 'rb')
  110. self.ftp.make_dirs(file_path)
  111. self.ftp.create_file(file_path, temp_file)
  112. temp_file.close()
  113. os.unlink(temp_file.name)
  114. def set_fail(self, user, message):
  115. self.log.user = user
  116. self.log.status_message = message
  117. self.log.status = False
  118. self.log.save()
  119. notification_fail(self.host, self.service, self.json_string, message)