From 156a54dc32b56105a48b9524a1124411a9e38841 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Thu, 11 Jun 2015 16:02:52 +0200 Subject: [PATCH] agent: use lock on hobo-deploy (wait for 10s) (#7534) --- debian/control | 4 +++- hobo/agent/worker/services.py | 22 +++++++++++++++++----- hobo/agent/worker/settings.py | 4 ++++ requirements.txt | 1 + 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/debian/control b/debian/control index 9b056a6..d2a2ac2 100644 --- a/debian/control +++ b/debian/control @@ -30,6 +30,8 @@ Description: Rapid Remote Deployment Daemon Package: hobo-agent Architecture: all Depends: python-hobo (= ${binary:Version}), - sudo, supervisor + sudo, + supervisor, + python-lockfile Description: Rapid Remote Deployment Agent diff --git a/hobo/agent/worker/services.py b/hobo/agent/worker/services.py index 842349a..d276d55 100644 --- a/hobo/agent/worker/services.py +++ b/hobo/agent/worker/services.py @@ -1,12 +1,10 @@ -import ConfigParser import fnmatch import json import logging import os -import string import subprocess import urllib2 -import urlparse +from lockfile import FileLock, LockTimeout from . import settings @@ -14,10 +12,11 @@ logger = logging.getLogger('hobo.agent') class BaseService(object): - def __init__(self, base_url, title, secret_key, **kwargs): + def __init__(self, base_url, title, secret_key, slug, **kwargs): self.base_url = base_url self.title = title self.secret_key = secret_key + self.slug = slug def is_for_us(self): # This function checks if the requested service is to be hosted @@ -107,4 +106,17 @@ def deploy(environment): if service_obj.check_timestamp(hobo_timestamp): logger.debug('skipping uptodate site: %r', service_obj) continue - service_obj.execute(environment) + lock = FileLock(os.path.join(settings.LOCKDIR, + 'hobo-deploy-%s-%s.lock' % (service_id, service_obj.slug))) + try: + lock.acquire(timeout=settings.LOCKTIMEOUT) + except LockTimeout: + logger.warning('skipping as locked by other hobo-deploy: %r', service_obj) + continue + try: + logger.debug('hobo-deploy: %r', service_obj) + service_obj.execute(environment) + except: + lock.release() + raise + lock.release() diff --git a/hobo/agent/worker/settings.py b/hobo/agent/worker/settings.py index 44d93c1..9384570 100644 --- a/hobo/agent/worker/settings.py +++ b/hobo/agent/worker/settings.py @@ -23,6 +23,10 @@ COMBO_MANAGE_COMMAND = '/usr/lib/combo/manage.py' PASSERELLE_MANAGE_COMMAND = '/usr/lib/passerelle/manage.py' FARGO_MANAGE_COMMAND = '/usr/bin/fargo-manage' +# where to put lock files, used when run hobo-deploy commands +LOCKDIR = '/var/tmp/' +LOCKTIMEOUT = 10 + local_settings_file = os.environ.get('HOBO_AGENT_SETTINGS_FILE', os.path.join(os.path.dirname(__file__), 'local_settings.py')) if os.path.exists(local_settings_file): diff --git a/requirements.txt b/requirements.txt index 6299817..617c1a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ django<1.8 -e git+http://repos.entrouvert.org/gadjo.git/#egg=gadjo celery django-mellon +lockfile -- 2.1.4