def _handle_log_stream(self, stream): log_lines = [] last_emit_time = time.time() last_heart_beat = time.time() status = True try: for log_line in stream: new_log_lines, new_status = self._prepare_log_lines(log_line) log_lines += new_log_lines if not new_status: status = new_status publish_cond = (len(log_lines) == publisher.MESSAGES_COUNT or (log_lines and time.time() - last_emit_time > publisher.MESSAGES_TIMEOUT)) if publish_cond: self._handle_logs(log_lines) log_lines = [] last_emit_time = time.time() if time.time() - last_heart_beat > self.HEART_BEAT_INTERVAL: last_heart_beat = time.time() RedisHeartBeat.build_ping(build_id=self.build_job.id) if log_lines: self._handle_logs(log_lines) except (BuildError, APIError) as e: self._handle_logs( LogSpec(log_line='Build Error {}'.format(e), log_level=publisher.ERROR)) return False return status
def test_build_jobs_check_heartbeat(self): build1 = BuildJobFactory() BuildJobStatusFactory(job=build1, status=JobLifeCycle.RUNNING) RedisHeartBeat.build_ping(build_id=build1.id) build2 = BuildJobFactory() BuildJobStatusFactory(job=build2, status=JobLifeCycle.RUNNING) build_jobs_check_heartbeat(build1.id) build1.refresh_from_db() self.assertEqual(build1.last_status, JobLifeCycle.RUNNING) build_jobs_check_heartbeat(build2.id) build2.refresh_from_db() self.assertEqual(build2.last_status, JobLifeCycle.FAILED)
def test_redis_heartbeat_build(self): heartbeat = RedisHeartBeat(build=1) self.assertEqual(heartbeat.redis_key, RedisHeartBeat.KEY_BUILD.format(1)) self.assertEqual(heartbeat.is_alive(), False) self.assertEqual(RedisHeartBeat.build_is_alive(1), False) heartbeat.ping() self.assertEqual(heartbeat.is_alive(), True) self.assertEqual(RedisHeartBeat.build_is_alive(1), True) heartbeat.clear() self.assertEqual(heartbeat.is_alive(), False) self.assertEqual(RedisHeartBeat.build_is_alive(1), False) RedisHeartBeat.build_ping(1) self.assertEqual(heartbeat.is_alive(), True) self.assertEqual(RedisHeartBeat.build_is_alive(1), True)
def _handle_log_stream(self, stream): log_lines = [] last_heart_beat = time.time() status = True try: for log_line in stream: new_log_lines, new_status = self._prepare_log_lines(log_line) log_lines += new_log_lines if not new_status: status = new_status self._handle_logs(log_lines) log_lines = [] if time.time() - last_heart_beat > self.HEART_BEAT_INTERVAL: last_heart_beat = time.time() RedisHeartBeat.build_ping(build_id=self.build_job.id) if log_lines: self._handle_logs(log_lines) except (BuildError, APIError) as e: self._handle_logs('{}: Could not build the image, ' 'encountered {}'.format(LogLevels.ERROR, e)) return False return status
def _ping_heartbeat(self) -> None: RedisHeartBeat.build_ping(self.id)
def post(self, request, *args, **kwargs): RedisHeartBeat.build_ping(build_id=self.build.id) return Response(status=status.HTTP_200_OK)