+ # first set some parameters, before measurement can start\r
+ def setup_flow(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=0):\r
+\r
+ flow_metric = {}\r
+\r
+ # check if port is specified (vnf:port)\r
+ if vnf_interface is None:\r
+ # take first interface by default\r
+ connected_sw = self.net.DCNetwork_graph.neighbors(vnf_name)[0]\r
+ link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw]\r
+ vnf_interface = link_dict[0]['src_port_id']\r
+\r
+ flow_metric['vnf_name'] = vnf_name\r
+ flow_metric['vnf_interface'] = vnf_interface\r
+\r
+ vnf_switch = None\r
+ for connected_sw in self.net.DCNetwork_graph.neighbors(vnf_name):\r
+ link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw]\r
+ for link in link_dict:\r
+ # logging.info("{0},{1}".format(link_dict[link],vnf_interface))\r
+ if link_dict[link]['src_port_id'] == vnf_interface:\r
+ # found the right link and connected switch\r
+ # logging.info("{0},{1}".format(link_dict[link]['src_port_id'], vnf_source_interface))\r
+ vnf_switch = connected_sw\r
+ flow_metric['mon_port'] = link_dict[link]['dst_port_nr']\r
+ break\r
+\r
+ if not vnf_switch:\r
+ logging.exception("vnf switch of {0}:{1} not found!".format(vnf_name, vnf_interface))\r
+ return "vnf switch of {0}:{1} not found!".format(vnf_name, vnf_interface)\r
+\r
+ try:\r
+ # default port direction to monitor\r
+ if metric is None:\r
+ metric = 'tx_packets'\r
+\r
+ next_node = self.net.getNodeByName(vnf_switch)\r
+\r
+ if not isinstance(next_node, OVSSwitch):\r
+ logging.info("vnf: {0} is not connected to switch".format(vnf_name))\r
+ return\r
+\r
+ flow_metric['previous_measurement'] = 0\r
+ flow_metric['previous_monitor_time'] = 0\r
+\r
+ flow_metric['switch_dpid'] = int(str(next_node.dpid), 16)\r
+ flow_metric['metric_key'] = metric\r
+ flow_metric['cookie'] = cookie\r
+\r
+ self.monitor_flow_lock.acquire()\r
+ self.flow_metrics.append(flow_metric)\r
+ self.monitor_flow_lock.release()\r
+\r
+ logging.info('Started monitoring flow:{3} {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric, cookie))\r
+ return 'Started monitoring flow:{3} {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric, cookie)\r
+\r
+ except Exception as ex:\r
+ logging.exception("setup_metric error.")\r
+ return ex.message\r
+\r
+\r