url = f'https://{self.target_ip}:{self.target_port}/data'
try:
req = Request(url, data, {'Content-Type': 'application/json'})
- urlopen(req, context=ssl_ctx)
+ send_time = time.monotonic()
+ with urlopen(req, context=ssl_ctx) as response:
+ response_str = response.read()
+ response_json = json.loads(response_str)
+ total_request_time = datetime.timedelta(seconds=(time.monotonic() - send_time)).total_seconds()
+ logger.info(f'Received mgr response: "{response_json["result"]}" {total_request_time} seconds after sending request.')
except Exception as e:
logger.error(f'Failed to send metadata to mgr: {e}')
self.mgr = mgr
@cherrypy.tools.json_in()
- def POST(self) -> None:
+ @cherrypy.tools.json_out()
+ def POST(self) -> Dict[str, Any]:
data: Dict[str, Any] = cherrypy.request.json
+ results: Dict[str, Any] = {}
try:
self.check_request_fields(data)
except Exception as e:
+ results['result'] = f'Bad metadata: {e}'
self.mgr.log.warning(f'Received bad metadata from an agent: {e}')
else:
# if we got here, we've already verified the keyring of the agent. If
# host agent is reporting on is marked offline, it shouldn't be any more
self.mgr.offline_hosts_remove(data['host'])
- self.handle_metadata(data)
+ results['result'] = self.handle_metadata(data)
+ return results
def check_request_fields(self, data: Dict[str, Any]) -> None:
fields = '{' + ', '.join([key for key in data.keys()]) + '}'
self.mgr.log.warning(
f'Agent on host {host} reported incomplete metadata. Not all of {metadata_types_str} were present. Received fields {fields}')
- def handle_metadata(self, data: Dict[str, Any]) -> None:
+ def handle_metadata(self, data: Dict[str, Any]) -> str:
try:
host = data['host']
self.mgr.cache.agent_ports[host] = int(data['port'])
if host not in self.mgr.cache.agent_counter:
- self.mgr.log.debug(
- f'Got metadata from agent on host {host} with no known counter entry. Starting counter at 1 and requesting new metadata')
self.mgr.cache.agent_counter[host] = 1
self.mgr.agent_helpers._request_agent_acks({host})
- return
+ res = f'Got metadata from agent on host {host} with no known counter entry. Starting counter at 1 and requesting new metadata'
+ self.mgr.log.debug(res)
+ return res
# update timestamp of most recent agent update
self.mgr.cache.agent_timestamp[host] = datetime_now()
self.mgr.log.debug(
f'Received up-to-date metadata from agent on host {host}.')
+ return 'Successfully processed metadata.'
+
except Exception as e:
- self.mgr.log.warning(
- f'Failed to update metadata with metadata from agent on host {host}: {e}')
+ err_str = f'Failed to update metadata with metadata from agent on host {host}: {e}'
+ self.mgr.log.warning(err_str)
+ return err_str
class AgentMessageThread(threading.Thread):