예제 #1
0
 def update(self, rcv_time, dp_id, msg):
     super(GaugeFlowTableInfluxDBLogger, self).update(rcv_time, dp_id, msg)
     jsondict = msg.to_jsondict()
     points = []
     for stats_reply in jsondict['OFPFlowStatsReply']['body']:
         stats = stats_reply['OFPFlowStats']
         packet_count = int(stats['packet_count'])
         byte_count = int(stats['byte_count'])
         instructions = stats['instructions']
         tags = {
             'dp_name': self.dp.name,
             'table_id': int(stats['table_id']),
             'priority': int(stats['priority']),
             'inst_count': len(instructions),
         }
         oxm_matches = stats['match']['OFPMatch']['oxm_fields']
         for oxm_match in oxm_matches:
             oxm_tlv = oxm_match['OXMTlv']
             mask = oxm_tlv['mask']
             val = oxm_tlv['value']
             field = oxm_tlv['field']
             if mask is not None:
                 val = '/'.join((str(val), str(mask)))
             tags[field] = val
             if field == 'vlan_vid' and mask is None:
                 tags['vlan'] = devid_present(int(val))
         points.append(
             self.make_point(tags, rcv_time, 'flow_packet_count',
                             packet_count))
         points.append(
             self.make_point(tags, rcv_time, 'flow_byte_count', byte_count))
     self.ship_points(points)
예제 #2
0
 def _parse_flow_stats(self, stats):
     """Parse flow stats reply message into tags/labels and byte/packet counts."""
     packet_count = int(stats['packet_count'])
     byte_count = int(stats['byte_count'])
     instructions = stats['instructions']
     tags = {
         'dp_name': self.dp.name,
         'dp_id': hex(self.dp.dp_id),
         'table_id': int(stats['table_id']),
         'priority': int(stats['priority']),
         'inst_count': len(instructions),
         'cookie': int(stats['cookie']),
     }
     oxm_matches = stats['match']['OFPMatch']['oxm_fields']
     for oxm_match in oxm_matches:
         oxm_tlv = oxm_match['OXMTlv']
         mask = oxm_tlv['mask']
         val = oxm_tlv['value']
         orig_field = oxm_tlv['field']
         if mask is not None:
             val = '/'.join((str(val), str(mask)))
         field = OLD_MATCH_FIELDS.get(orig_field, orig_field)
         tags[field] = val
         if field == 'vlan_vid' and mask is None:
             tags['vlan'] = devid_present(int(val))
     return (
         ('flow_packet_count', tags, packet_count),
         ('flow_byte_count', tags, byte_count))
예제 #3
0
 def _parse_flow_stats(self, stats):
     """Parse flow stats reply message into tags/labels and byte/packet counts."""
     packet_count = int(stats['packet_count'])
     byte_count = int(stats['byte_count'])
     instructions = stats['instructions']
     tags = {
         'dp_name': self.dp.name,
         'dp_id': hex(self.dp.dp_id),
         'table_id': int(stats['table_id']),
         'priority': int(stats['priority']),
         'inst_count': len(instructions),
     }
     oxm_matches = stats['match']['OFPMatch']['oxm_fields']
     for oxm_match in oxm_matches:
         oxm_tlv = oxm_match['OXMTlv']
         mask = oxm_tlv['mask']
         val = oxm_tlv['value']
         field = oxm_tlv['field']
         if mask is not None:
             val = '/'.join((str(val), str(mask)))
         if field in OLD_MATCH_FIELDS:
             field = OLD_MATCH_FIELDS[field]
         tags[field] = val
         if field == 'vlan_vid' and mask is None:
             tags['vlan'] = devid_present(int(val))
     return (('flow_packet_count', tags, packet_count), ('flow_byte_count',
                                                         tags, byte_count))
예제 #4
0
 def flow_timeout(self, table_id, match):
     ofmsgs = []
     if table_id in (self.eth_src_table.table_id,
                     self.eth_dst_table.table_id):
         in_port = None
         eth_src = None
         eth_dst = None
         vid = None
         for field, value in list(match.items()):
             if field == 'in_port':
                 in_port = value
             elif field == 'eth_src':
                 eth_src = value
             elif field == 'eth_dst':
                 eth_dst = value
             elif field == 'vlan_vid':
                 vid = valve_of.devid_present(value)
         if vid:
             vlan = self.vlans[vid]
             if eth_src and in_port:
                 port = self.ports[in_port]
                 ofmsgs.extend(self._src_rule_expire(vlan, port, eth_src))
             elif eth_dst:
                 ofmsgs.extend(self._dst_rule_expire(vlan, eth_dst))
     return ofmsgs
예제 #5
0
 def flow_timeout(self, now, table_id, match):
     ofmsgs = []
     if table_id in (self.eth_src_table.table_id, self.eth_dst_table.table_id):
         if 'vlan_vid' in match:
             vlan = self.vlans[valve_of.devid_present(match['vlan_vid'])]
             in_port = None
             eth_src = None
             eth_dst = None
             for field, value in list(match.items()):
                 if field == 'in_port':
                     in_port = value
                 elif field == 'eth_src':
                     eth_src = value
                 elif field == 'eth_dst':
                     eth_dst = value
             if eth_src and in_port:
                 port = self.ports[in_port]
                 ofmsgs.extend(self._src_rule_expire(vlan, port, eth_src))
             elif eth_dst:
                 ofmsgs.extend(self._dst_rule_expire(now, vlan, eth_dst))
     return ofmsgs