def echo(ver_msg): """ Process valid node msg/queues, ie, msg must contain a valid node ID and version (where "valid" version is >= minimum baseline version). Old format conatins only the node ID string, new format is JSON msg with node ID and `fpnd` version string. :param ver_msg: node ID or json :return: parsed msg if version is valid, else UPGRADE msg """ msg = parse_version_msg(ver_msg) min_ver = '0.9.6' if msg != []: if valid_announce_msg(msg[0]): logger.debug('Got valid announce msg: {}'.format(msg)) clean_stale_cfgs(msg[0], cfg_q) node_data = lookup_node_id(msg[0], tmp_q) if node_data: logger.info('Got valid announce msg from host {} (node {})'.format(node_data[msg[0]], msg)) if valid_version(min_ver, msg[1]): handle_announce_msg(node_q, reg_q, wait_q, msg[0]) reply = make_version_msg(msg[0]) logger.info('Got valid node version: {}'.format(msg)) else: reply = make_version_msg(msg[0], 'UPGRADE_REQUIRED') logger.error('Invalid version from host {} is: {} < {}'.format(node_data[msg[0]], msg, min_ver)) return reply else: node_data = lookup_node_id(msg, tmp_q) if node_data: logger.warning('Bad announce msg from host {} (node {})'.format(node_data[msg[0]], msg)) else: logger.warning('Bad announce msg: {}'.format(msg)) else: logger.error('Could not parse version msg: {}'.format(msg))
def test_handle_msgs(self): self.assertEqual(list(self.node_q), []) self.node_q.append(self.node1) self.node_q.append(self.node2) self.node_q.append(self.node3) self.wait_q.append(self.node3) self.assertEqual(list(self.node_q), [self.node1, self.node2, self.node3]) self.assertEqual(list(self.reg_q), []) self.assertEqual(list(self.wait_q), [self.node3]) handle_announce_msg(self.node_q, self.reg_q, self.wait_q, self.node1) self.assertEqual(list(self.node_q), [self.node1, self.node2, self.node3]) self.assertEqual(list(self.reg_q), [self.node1]) self.assertEqual(list(self.wait_q), [self.node3]) handle_announce_msg(self.node_q, self.reg_q, self.wait_q, self.node2) self.assertEqual(list(self.node_q), [self.node1, self.node2, self.node3]) self.assertEqual(list(self.reg_q), [self.node1, self.node2]) self.assertEqual(list(self.wait_q), [self.node3]) # we now allow duplicate IDs in the reg queue handle_announce_msg(self.node_q, self.reg_q, self.wait_q, self.node3) self.assertIn(self.node3, list(self.reg_q)) self.assertEqual(list(self.wait_q), [self.node3])
def echo(msg): """ Process valid node msg/queues, ie, msg must be a valid node ID. :param str node ID: zerotier node identity :return: str node ID """ if valid_announce_msg(msg): logger.debug('Got valid announce msg: {}'.format(msg)) clean_stale_cfgs(msg, cfg_q) handle_announce_msg(node_q, reg_q, wait_q, msg) node_data = lookup_node_id(msg, tmp_q) if node_data: logger.info('Got valid announce msg from host {} (node {})'.format( node_data[msg], msg)) return msg else: node_data = lookup_node_id(msg, tmp_q) if node_data: logger.info('Bad announce msg from host {} (node {})'.format( node_data[msg], msg)) else: logger.warning('Bad announce msg: {}'.format(msg))