From 4e22e22ba12b9c6899d9f49f76838bbec491ae4f Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Tue, 23 Dec 2014 14:09:04 -0500 Subject: [PATCH] We have to serialize our build data before sending it to etc. --- buildman/manager/ephemeral.py | 19 +++++++++++-------- test/test_buildman.py | 7 ++++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py index 39776b60e..3b467bb23 100644 --- a/buildman/manager/ephemeral.py +++ b/buildman/manager/ephemeral.py @@ -3,6 +3,7 @@ import etcd import uuid import calendar import os.path +import json from datetime import datetime, timedelta from trollius import From, coroutine, Return, async @@ -74,7 +75,8 @@ class EphemeralBuilderManager(BaseManager): if etcd_result.action == ETCD_EXPIRE_RESULT: # Handle the expiration logger.debug('Builder expired, clean up the old build node') - async(self._clean_up_old_builder(etcd_result.key, etcd_result._prev_node.value)) + job_metadata = json.loads(etcd_result._prev_node.value) + async(self._clean_up_old_builder(etcd_result.key, job_metadata)) def initialize(self, manager_config): logger.debug('Calling initialize') @@ -149,7 +151,7 @@ class EphemeralBuilderManager(BaseManager): } try: - yield From(self._etcd_client.write(job_key, payload, prevExist=False, ttl=ttl)) + yield From(self._etcd_client.write(job_key, json.dumps(payload), prevExist=False, ttl=ttl)) component = self.register_component(realm, BuildComponent, token=token) self._component_to_job[component] = build_job except KeyError: @@ -163,7 +165,7 @@ class EphemeralBuilderManager(BaseManager): # Store the builder in etcd associated with the job id payload['builder_id'] = builder_id - yield From(self._etcd_client.write(job_key, payload, prevExist=True, ttl=ttl)) + yield From(self._etcd_client.write(job_key, json.dumps(payload), prevExist=True, ttl=ttl)) raise Return(True) @@ -199,9 +201,10 @@ class EphemeralBuilderManager(BaseManager): def job_heartbeat(self, build_job): # Extend the deadline in etcd job_key = self._etcd_job_key(build_job) - build_job_response = yield From(self._etcd_client.read(job_key)) + build_job_metadata_response = yield From(self._etcd_client.read(job_key)) + build_job_metadata = json.loads(build_job_metadata_response.value) - max_expiration = datetime.utcfromtimestamp(build_job_response.value['max_expiration']) + max_expiration = datetime.utcfromtimestamp(build_job_metadata['max_expiration']) max_expiration_remaining = max_expiration - datetime.utcnow() max_expiration_sec = max(0, int(max_expiration_remaining.total_seconds())) @@ -210,11 +213,11 @@ class EphemeralBuilderManager(BaseManager): payload = { 'expiration': calendar.timegm(new_expiration.timetuple()), - 'builder_id': build_job_response.value['builder_id'], - 'max_expiration': build_job_response.value['max_expiration'], + 'builder_id': build_job_metadata['builder_id'], + 'max_expiration': build_job_metadata['max_expiration'], } - yield From(self._etcd_client.write(job_key, payload, ttl=ttl)) + yield From(self._etcd_client.write(job_key, json.dumps(payload), ttl=ttl)) self.job_heartbeat_callback(build_job) diff --git a/test/test_buildman.py b/test/test_buildman.py index 9d0f5c1f4..e33adccbd 100644 --- a/test/test_buildman.py +++ b/test/test_buildman.py @@ -2,6 +2,7 @@ import unittest import etcd import os.path import time +import json from trollius import coroutine, get_event_loop, From, Future, sleep from mock import Mock @@ -130,7 +131,7 @@ class TestEphemeral(unittest.TestCase): expired_result.action = ETCD_EXPIRE_RESULT expired_result.key = self.mock_job_key expired_result._prev_node = Mock(spec=etcd.EtcdResult) - expired_result._prev_node.value = {'builder_id': '1234'} + expired_result._prev_node.value = json.dumps({'builder_id': '1234'}) expired_future = Future() expired_future.set_result(expired_result) @@ -162,11 +163,11 @@ class TestEphemeral(unittest.TestCase): def test_heartbeat_response(self): expiration_timestamp = time.time() + 60 builder_result = Mock(spec=etcd.EtcdResult) - builder_result.value = { + builder_result.value = json.dumps({ 'builder_id': '123', 'expiration': expiration_timestamp, 'max_expiration': expiration_timestamp, - } + }) self.etcd_client_mock.read = Mock(return_value=builder_result) yield From(self.manager.job_heartbeat(self.mock_job))