Skip to content

Commit

Permalink
Allow a Swarm worker to connect to multiple managers
Browse files Browse the repository at this point in the history
  • Loading branch information
rycus86 committed Jan 17, 2018
1 parent ee8e073 commit 27ab795
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 15 deletions.
27 changes: 14 additions & 13 deletions src/swarm_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ class Worker(HttpServer):

EMPTY_DICT = dict()

def __init__(self, manager, retries=0, events=None, metrics_port=9414):
def __init__(self, managers, retries=0, events=None, metrics_port=9414):
super(Worker, self).__init__(self.worker_port)

self.manager = manager
self.managers = managers
self.retries = retries
self.events = events or self.DEFAULT_EVENTS
self.metrics = MetricsServer(metrics_port)
Expand Down Expand Up @@ -82,20 +82,21 @@ def is_watched(self, event):
return False

def send_update(self, status):
for _ in range(self.retries + 1):
try:
response = requests.post('http://%s:%d/' % (self.manager, self.manager_port), timeout=(5, 30))
for manager in self.managers:
for _ in range(self.retries + 1):
try:
response = requests.post('http://%s:%d/' % (manager, self.manager_port), timeout=(5, 30))

logger.info('Update (%s) sent to http://%s:%d/ : HTTP %s : %s',
status, self.manager, self.manager_port, response.status_code, response.text.strip())
logger.info('Update (%s) sent to http://%s:%d/ : HTTP %s : %s',
status, manager, self.manager_port, response.status_code, response.text.strip())

send_counter.labels(self.manager).inc()
send_counter.labels(manager).inc()

break
break

except Exception as ex:
logger.error('Failed to send update to http://%s:%d/: %s',
self.manager, self.manager_port, ex, exc_info=1)
except Exception as ex:
logger.error('Failed to send update to http://%s:%d/: %s',
manager, self.manager_port, ex, exc_info=1)

def shutdown(self):
super(Worker, self).shutdown()
Expand All @@ -108,7 +109,7 @@ def parse_arguments(args=sys.argv[1:]):
parser = argparse.ArgumentParser(description='PyGen cli to send HTTP updates on Docker events')

parser.add_argument('--manager',
metavar='<HOSTNAME>', required=True,
metavar='<HOSTNAME>', required=True, nargs='+',
help='The target hostname of the PyGen manager instance listening on port 9411')
parser.add_argument('--retries',
required=False, type=int, default=0,
Expand Down
9 changes: 8 additions & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,15 @@ def test_swarm_worker_arguments(self):
'--retries', '12',
'--debug'])

self.assertEqual(args.manager, 'manager-host')
self.assertEqual(args.manager, ['manager-host'])
self.assertEqual(args.retries, 12)
self.assertEqual(args.events, ['start', 'stop', 'die', 'health_status'])
self.assertTrue(args.debug)

args = swarm_worker.parse_arguments(['--manager', 'manager1', 'manager2',
'--events', 'start', 'stop'])

self.assertEqual(args.manager, ['manager1', 'manager2'])
self.assertEqual(args.events, ['start', 'stop'])
self.assertFalse(args.debug)

2 changes: 1 addition & 1 deletion tests/test_swarm_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class SwarmManagerTest(unittest.TestCase):
def setUp(self):
self.manager = pygen.PyGen(template='#', interval=[0], swarm_manager=True,
workers=['localhost'])
self.worker = swarm_worker.Worker('localhost')
self.worker = swarm_worker.Worker(['localhost'])
self.worker.start()

self.assertIsNotNone(self.manager.swarm_manager)
Expand Down

0 comments on commit 27ab795

Please sign in to comment.