ftp_deploy.utils.deploy: 95 total statements, 91.6% covered

Generated: Sat 2014-02-08 14:54 GMT

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

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