ftp_deploy.views: 89 total statements, 5.3% covered

Generated: Thu 2013-12-19 21:13 GMT

Source file: /var/www/service.dev/service/ftp_deploy/views.py

Stats: 4 executed, 71 missed, 14 excluded, 38 ignored

  1. # -*- coding: utf-8 -*-
  2. import os
  3. import json
  4. from ftplib import FTP
  5. import tempfile
  6. from django.views.generic.base import View
  7. from django.http import HttpResponse, Http404
  8. from django.utils.decorators import method_decorator
  9. from django.views.decorators.csrf import csrf_exempt
  10. from .models import Log, Service
  11. from .conf import *
  12. from .utils.core import absolute_url, LockError
  13. from .utils.ftp import ftp_connection
  14. from .utils.email import notification_success, notification_fail
  15. from .utils.curl import curl_connection
  16. class DeployView(View):
  17. """Main view receive POST Hook from repository"""
  18. @method_decorator(csrf_exempt)
  19. def dispatch(self, *args, **kwargs):
  20. try:
  21. self.service = Service.objects.get(secret_key=kwargs['secret_key'])
  22. except Exception, e:
  23. raise Http404
  24. self.status = 200
  25. self.bitbucket_username = BITBUCKET_SETTINGS['username']
  26. self.bitbucket_password = BITBUCKET_SETTINGS['password']
  27. self.bitbucket_branch = self.service.repo_branch
  28. self.ftp_host = self.service.ftp_host
  29. self.ftp_username = self.service.ftp_username
  30. self.ftp_password = self.service.ftp_password
  31. self.ftp_path = self.service.ftp_path
  32. return super(DeployView, self).dispatch(*args, **kwargs)
  33. def post(self, request, *args, **kwargs):
  34. self.json_string = request.POST['payload'].decode('string_escape').replace('\n', '')
  35. self.data = json.loads(self.json_string)
  36. last_commit = len(self.data['commits']) - 1
  37. if self.data['commits'][last_commit]['branch'] == self.bitbucket_branch:
  38. self.log = Log()
  39. self.log.payload = self.json_string
  40. self.log.service = self.service
  41. self.log.save()
  42. try:
  43. self.ftp = ftp_connection(self.ftp_host, self.ftp_username, self.ftp_password, self.ftp_path)
  44. if self.service.lock:
  45. raise LockError()
  46. self.service.check = False
  47. self.service.lock = True
  48. self.service.save()
  49. self.ftp.connect()
  50. except LockError, e:
  51. self.set_fail(request, 'Service Locked', e)
  52. except Exception, e:
  53. self.set_fail(request, 'FTP Connection', e)
  54. else:
  55. try:
  56. curl = curl_connection(self.bitbucket_username, self.bitbucket_password)
  57. curl.authenticate()
  58. for i, commit in enumerate(self.data['commits']):
  59. for files in commit['files']:
  60. file_path = files['file']
  61. if files['type'] == 'removed':
  62. self.ftp.remove_file(file_path)
  63. else:
  64. url = 'https://api.bitbucket.org/1.0/repositories%sraw/%s/%s' % (self.data['repository']['absolute_url'], commit['node'], file_path)
  65. url = str(url.encode('utf-8'))
  66. value = curl.perform(url)
  67. temp_file = tempfile.NamedTemporaryFile(delete=False)
  68. temp_file.write(value)
  69. temp_file.close()
  70. temp_file = open(temp_file.name, 'rb')
  71. self.ftp.make_dirs(file_path)
  72. self.ftp.create_file(file_path, temp_file)
  73. temp_file.close()
  74. os.unlink(temp_file.name)
  75. except Exception, e:
  76. self.set_fail(request, self.data['user'], e)
  77. else:
  78. self.log.user = self.data['user']
  79. self.log.status = True
  80. self.log.save()
  81. notification_success(absolute_url(request).build(), self.service, self.json_string)
  82. finally:
  83. curl.close()
  84. finally:
  85. self.ftp.quit()
  86. self.service.lock = False
  87. self.service.check = True
  88. self.service.save()
  89. return HttpResponse(status=self.status)
  90. def set_fail(self, request, user, message):
  91. self.log.user = user
  92. self.log.status_message = message
  93. self.log.status = False
  94. self.log.save()
  95. self.service.status = False
  96. self.status = 500
  97. notification_fail(absolute_url(request).build(), self.service, self.json_string, message)