def test_callback_easy(self): """Test if a called callback adds the node - host to the dict.""" lookup = HostLookup() for x in range(1, 3): rstat = RatedStatistics() rstat.host = "host1" rstat.seuid = "n%s%s%d" % (SEUID_DELIMITER, "node", x) lookup.callback_rated(rstat) test = lookup.get_host("node1") == "host1" self.assertTrue(test)
def test_get_node_list(self): """Test if a simple reverse lookup with 9 nodes at one host works.""" lookup = HostLookup() node_orig_list = list() for x in range(1, 10): rstat = RatedStatistics() rstat.host = "host1" rstat.seuid = "n%s%s%d" % (SEUID_DELIMITER, "node", x) lookup.callback_rated(rstat) node_orig_list.append("node%d" % x) node_list = lookup.get_node_list("host1") self.assertItemsEqual(node_list, node_orig_list)
def create_msg(seuid, host, entity): msg = RatedStatistics() msg.seuid = seuid msg.host = host now = rospy.Time.now() msg.window_start = now - rospy.Duration(1) msg.window_stop = now msg.rated_statistics_entity = entity return msg
def create_simple_bag(): bag = rosbag.Bag('bags/john.bag', 'w') msg = RatedStatistics() msg.seuid = "n" + SEUID_DELIMITER + "node1" msg.host = "host1" now = rospy.Time.now() msg.window_start = now - rospy.Duration(5) msg.window_stop = now msg.rated_statistics_entity = [create_statistic_entity()] try: bag.write('/statistics_rated', msg) finally: bag.close()
def to_msg_type(self): """ Creates a RatedStatisticsContainer messagetype based on the current data. :return: A RatedStatisticsContainer object from the current data. """ r = RatedStatistics() r.seuid = self.seuid if self.seuid[0] == "h": r.host = self.seuid[2:] else: r.host = self.host try: r.window_start = self.get_value("window_start")["actual"] r.window_stop = self.get_value("window_stop")["actual"] except KeyError: r.window_start = r.window_stop = None for k in self.keys(): if k in ("host", "node", "node_sub", "node_pub", "topic", "window_start", "window_stop"): continue re = RatedStatisticsEntity() re.statistic_type = k re.state = [] values = self.get_value(k) if isinstance(values["actual"], (list, tuple)): for i, v in enumerate(values["actual"]): re.actual_value.append( prepare_number_for_representation(v)) try: re.state.append(values["state"][i]) re.expected_value.append( prepare_number_for_representation( values["expected"][i])) except TypeError: re.state.append(values["state"]) re.expected_value.append("?") else: re.actual_value.append( prepare_number_for_representation(values["actual"])) re.state.append(values["state"]) if values["expected"] is None: re.expected_value.append("?") else: re.expected_value.append( prepare_number_for_representation(values["expected"])) r.rated_statistics_entity.append(re) return r
def to_msg_type(self): """ Creates a RatedStatisticsContainer messagetype based on the current data. :return: A RatedStatisticsContainer object from the current data. """ r = RatedStatistics() r.seuid = self.seuid if self.seuid[0] == "h": r.host = self.seuid[2:] else: r.host = self.host try: r.window_start = self.get_value("window_start")["actual"] r.window_stop = self.get_value("window_stop")["actual"] except KeyError: r.window_start = r.window_stop = None for k in self.keys(): if k in ("host", "node", "node_sub", "node_pub", "topic", "window_start", "window_stop"): continue re = RatedStatisticsEntity() re.statistic_type = k re.state = [] values = self.get_value(k) if isinstance(values["actual"], (list, tuple)): for i, v in enumerate(values["actual"]): re.actual_value.append(prepare_number_for_representation(v)) try: re.state.append(values["state"][i]) re.expected_value.append(prepare_number_for_representation(values["expected"][i])) except TypeError: re.state.append(values["state"]) re.expected_value.append("?") else: re.actual_value.append(prepare_number_for_representation(values["actual"])) re.state.append(values["state"]) if values["expected"] is None: re.expected_value.append("?") else: re.expected_value.append(prepare_number_for_representation(values["expected"])) r.rated_statistics_entity.append(re) return r
def compare_topic(self, data=None): """ Compares Messages about one topic :param data: List of Statistics messages :return: list of RatedStatistics messages """ if not data: data = [] by_connection = {} by_topic = {} result = [] frequency_set = False for message in data: seuid = SEUID(message) if not seuid.identifier in by_connection.keys(): by_connection[seuid.identifier] = { "window_min": rospy.Time.now(), "window_max": rospy.Time(0), "dropped_msgs": 0, "frequency": 0, "traffic": 0, "bandwidth": 0, "stamp_age_mean": rospy.Duration(0), "stamp_age_stddev": rospy.Duration(0), "stamp_age_max": rospy.Duration(0), "count": 0, } by_connection[seuid.identifier]["count"] += 1 window_len = message.window_stop - message.window_start if window_len.to_sec() == 0: window_len = rospy.Duration(1) by_connection[seuid.identifier]["window_min"] = min( message.window_start, by_connection[seuid.identifier]["window_min"] ) by_connection[seuid.identifier]["window_max"] = max( message.window_stop, by_connection[seuid.identifier]["window_max"] ) if hasattr(message, "delivered_msgs"): frequency_set = True by_connection[seuid.identifier]["frequency"] += message.delivered_msgs / float(window_len.to_sec()) by_connection[seuid.identifier]["dropped_msgs"] += message.dropped_msgs by_connection[seuid.identifier]["traffic"] += message.traffic by_connection[seuid.identifier]["bandwidth"] += message.traffic / float(window_len.to_sec()) by_connection[seuid.identifier]["stamp_age_max"] = max( message.stamp_age_max, by_connection[seuid.identifier]["stamp_age_max"] ) by_connection[seuid.identifier]["stamp_age_mean"] += message.stamp_age_mean # TODO by_connection[seuid.identifier]["stamp_age_stddev"] for connection in by_connection: seuid = SEUID(connection) for key in "frequency", "bandwidth", "dropped_msgs", "traffic", "stamp_age_mean": # average by_connection[connection][key] /= by_connection[connection]["count"] topic = seuid.get_seuid("topic") if not topic in by_topic.keys(): by_topic[topic] = { "window_min": rospy.Time.now(), "window_max": rospy.Time(0), "dropped_msgs": 0, "frequency": 0, "traffic": 0, "bandwidth": 0, "stamp_age_mean": rospy.Duration(0), "stamp_age_stddev": rospy.Duration(0), "stamp_age_max": rospy.Duration(0), "count": 0, } by_topic[topic]["count"] += 1 by_topic[topic]["window_min"] = min(by_connection[connection]["window_min"], by_topic[topic]["window_min"]) by_topic[topic]["window_max"] = max(by_connection[connection]["window_max"], by_topic[topic]["window_max"]) if "frequency" in by_connection[connection]: frequency_set = True by_topic[topic]["frequency"] += by_connection[connection]["frequency"] by_topic[topic]["dropped_msgs"] += by_connection[connection]["dropped_msgs"] by_topic[topic]["traffic"] += by_connection[connection]["traffic"] by_topic[topic]["bandwidth"] += by_connection[connection]["bandwidth"] by_topic[topic]["stamp_age_max"] = max( by_connection[connection]["stamp_age_max"], by_topic[topic]["stamp_age_max"] ) by_topic[topic]["stamp_age_mean"] += by_connection[connection]["stamp_age_mean"] # TODO by_connection[seuid.identifier]["stamp_age_stddev"] for topic in by_topic: by_topic[topic]["stamp_age_mean"] /= by_topic[topic]["count"] for topic, data in by_topic.iteritems(): specification = self.get(topic) r = RatedStatistics() r.window_start = data["window_min"] r.window_stop = data["window_max"] window_len = data["window_max"] - data["window_min"] if window_len.to_sec() == 0: window_len = rospy.Duration(1) r.seuid = topic fields = ["dropped_msgs", "traffic", "bandwidth", "stamp_age_max", "stamp_age_mean"] fields.remove("traffic") if frequency_set: fields.append("frequency") for f in fields: re = RatedStatisticsEntity() re.statistic_type = f value = data[f] re.actual_value.append(str(value)) limits = self.__get_limits(specification, re.statistic_type) re.expected_value.append(str(limits)) re.state = [self.__compare(value, limits)] r.rated_statistics_entity.append(re) re = RatedStatisticsEntity() re.statistic_type = "alive" re.expected_value = ["True"] re.actual_value = ["True"] re.state = [2] r.rated_statistics_entity.append(re) result.append(r) return result
def compare_topic(self, data=None): """ Compares Messages about one topic :param data: List of Statistics messages :return: list of RatedStatistics messages """ if not data: data = [] by_connection = {} by_topic = {} result = [] frequency_set = False for message in data: seuid = SEUID(message) if not seuid.identifier in by_connection.keys(): by_connection[seuid.identifier] = { "window_min": rospy.Time.now(), "window_max": rospy.Time(0), "dropped_msgs": 0, "frequency": 0, "traffic": 0, "bandwidth": 0, "stamp_age_mean": rospy.Duration(0), "stamp_age_stddev": rospy.Duration(0), "stamp_age_max": rospy.Duration(0), "count": 0, } by_connection[seuid.identifier]["count"] += 1 window_len = message.window_stop - message.window_start if window_len.to_sec() == 0: window_len = rospy.Duration(1) by_connection[seuid.identifier]["window_min"] = min(message.window_start, by_connection[seuid.identifier]["window_min"]) by_connection[seuid.identifier]["window_max"] = max(message.window_stop, by_connection[seuid.identifier]["window_max"]) if hasattr(message, "delivered_msgs"): frequency_set = True by_connection[seuid.identifier]["frequency"] += message.delivered_msgs / float(window_len.to_sec()) by_connection[seuid.identifier]["dropped_msgs"] += message.dropped_msgs by_connection[seuid.identifier]["traffic"] += message.traffic by_connection[seuid.identifier]["bandwidth"] += message.traffic / float(window_len.to_sec()) by_connection[seuid.identifier]["stamp_age_max"] = max(message.stamp_age_max, by_connection[seuid.identifier]["stamp_age_max"]) by_connection[seuid.identifier]["stamp_age_mean"] += message.stamp_age_mean #TODO by_connection[seuid.identifier]["stamp_age_stddev"] for connection in by_connection: seuid = SEUID(connection) for key in 'frequency', 'bandwidth', 'dropped_msgs', 'traffic', 'stamp_age_mean': # average by_connection[connection][key] /= by_connection[connection]['count'] topic = seuid.get_seuid('topic') if not topic in by_topic.keys(): by_topic[topic] = { "window_min": rospy.Time.now(), "window_max": rospy.Time(0), "dropped_msgs": 0, "frequency": 0, "traffic": 0, "bandwidth": 0, "stamp_age_mean": rospy.Duration(0), "stamp_age_stddev": rospy.Duration(0), "stamp_age_max": rospy.Duration(0), 'count': 0, } by_topic[topic]['count'] += 1 by_topic[topic]["window_min"] = min(by_connection[connection]['window_min'], by_topic[topic]["window_min"]) by_topic[topic]["window_max"] = max(by_connection[connection]['window_max'], by_topic[topic]["window_max"]) if "frequency" in by_connection[connection]: frequency_set = True by_topic[topic]["frequency"] += by_connection[connection]['frequency'] by_topic[topic]["dropped_msgs"] += by_connection[connection]['dropped_msgs'] by_topic[topic]["traffic"] += by_connection[connection]['traffic'] by_topic[topic]["bandwidth"] += by_connection[connection]['bandwidth'] by_topic[topic]["stamp_age_max"] = max(by_connection[connection]['stamp_age_max'], by_topic[topic]["stamp_age_max"]) by_topic[topic]["stamp_age_mean"] += by_connection[connection]['stamp_age_mean'] #TODO by_connection[seuid.identifier]["stamp_age_stddev"] for topic in by_topic: by_topic[topic]['stamp_age_mean'] /= by_topic[topic]['count'] for topic, data in by_topic.iteritems(): specification = self.get(topic) r = RatedStatistics() r.window_start = data["window_min"] r.window_stop = data["window_max"] window_len = data["window_max"] - data["window_min"] if window_len.to_sec() == 0: window_len = rospy.Duration(1) r.seuid = topic fields = ["dropped_msgs", "traffic", "bandwidth", "stamp_age_max", "stamp_age_mean"] fields.remove("traffic") if frequency_set: fields.append("frequency") for f in fields: re = RatedStatisticsEntity() re.statistic_type = f value = data[f] re.actual_value.append(str(value)) limits = self.__get_limits(specification, re.statistic_type) re.expected_value.append(str(limits)) re.state = [self.__compare(value, limits)] r.rated_statistics_entity.append(re) re = RatedStatisticsEntity() re.statistic_type = "alive" re.expected_value = ["True"] re.actual_value = ["True"] re.state = [2] r.rated_statistics_entity.append(re) result.append(r) return result