Merge remote-tracking branch 'origin/asyncio' into asyncio

This commit is contained in:
Jeremy committed 2015-02-16 16:53:56 -07:00
commit 516b882122
7 files changed
+221 -31

No files matched your search

+86 -16
View File
@@ -445,7 +445,7 @@ class IOUVM(BaseVM):
"base_port": "49000"}
bay_id = 0
for adapter in self._slots:
for adapter in self._adapters:
unit_id = 0
for unit in adapter.ports.keys():
nio = adapter.get_nio(unit)
@@ -716,7 +716,7 @@ class IOUVM(BaseVM):
id=self._id,
adapters=len(self._ethernet_adapters)))
self._slots = self._ethernet_adapters + self._serial_adapters
self._adapters = self._ethernet_adapters + self._serial_adapters
@property
def serial_adapters(self):
@@ -742,21 +742,21 @@ class IOUVM(BaseVM):
id=self._id,
adapters=len(self._serial_adapters)))
self._slots = self._ethernet_adapters + self._serial_adapters
self._adapters = self._ethernet_adapters + self._serial_adapters
def slot_add_nio_binding(self, adapter_number, port_number, nio):
def adapter_add_nio_binding(self, adapter_number, port_number, nio):
"""
Adds a slot NIO binding.
:param adapter_number: slot ID
Adds a adapter NIO binding.
:param adapter_number: adapter ID
:param port_number: port ID
:param nio: NIO instance to add to the slot/port
:param nio: NIO instance to add to the adapter/port
"""
try:
adapter = self._slots[adapter_number]
adapter = self._adapters[adapter_number]
except IndexError:
raise IOUError("Slot {adapter_number} doesn't exist on IOU {name}".format(name=self._name,
adapter_number=adapter_number))
raise IOUError("Adapter {adapter_number} doesn't exist on IOU {name}".format(name=self._name,
adapter_number=adapter_number))
if not adapter.port_exists(port_number):
raise IOUError("Port {port_number} doesn't exist in adapter {adapter}".format(adapter=adapter,
@@ -772,19 +772,19 @@ class IOUVM(BaseVM):
self._update_iouyap_config()
os.kill(self._iouyap_process.pid, signal.SIGHUP)
def slot_remove_nio_binding(self, adapter_number, port_number):
def adapter_remove_nio_binding(self, adapter_number, port_number):
"""
Removes a slot NIO binding.
:param adapter_number: slot ID
Removes a adapter NIO binding.
:param adapter_number: adapter ID
:param port_number: port ID
:returns: NIO instance
"""
try:
adapter = self._slots[adapter_number]
adapter = self._adapters[adapter_number]
except IndexError:
raise IOUError("Slot {adapter_number} doesn't exist on IOU {name}".format(name=self._name,
adapter_number=adapter_number))
raise IOUError("Adapter {adapter_number} doesn't exist on IOU {name}".format(name=self._name,
adapter_number=adapter_number))
if not adapter.port_exists(port_number):
raise IOUError("Port {port_number} doesn't exist in adapter {adapter}".format(adapter=adapter,
@@ -889,3 +889,73 @@ class IOUVM(BaseVM):
return path
else:
return None
def start_capture(self, adapter_number, port_number, output_file, data_link_type="DLT_EN10MB"):
"""
Starts a packet capture.
:param adapter_number: adapter ID
:param port_number: port ID
:param port: allocated port
:param output_file: PCAP destination file for the capture
:param data_link_type: PCAP data link type (DLT_*), default is DLT_EN10MB
"""
try:
adapter = self._adapters[adapter_number]
except IndexError:
raise IOUError("Adapter {adapter_number} doesn't exist on IOU {name}".format(name=self._name,
adapter_number=adapter_number))
if not adapter.port_exists(port_number):
raise IOUError("Port {port_number} doesn't exist in adapter {adapter}".format(adapter=adapter,
port_number=port_number))
nio = adapter.get_nio(port_number)
if nio.capturing:
raise IOUError("Packet capture is already activated on {adapter_number}/{port_number}".format(adapter_number=adapter_number,
port_number=port_number))
try:
os.makedirs(os.path.dirname(output_file))
except FileExistsError:
pass
except OSError as e:
raise IOUError("Could not create captures directory {}".format(e))
nio.startPacketCapture(output_file, data_link_type)
log.info("IOU {name} [id={id}]: starting packet capture on {adapter_number}/{port_number}".format(name=self._name,
id=self._id,
adapter_number=adapter_number,
port_number=port_number))
if self.is_iouyap_running():
self._update_iouyap_config()
os.kill(self._iouyap_process.pid, signal.SIGHUP)
def stop_capture(self, adapter_number, port_number):
"""
Stops a packet capture.
:param adapter_number: adapter ID
:param port_number: port ID
"""
try:
adapter = self._adapters[adapter_number]
except IndexError:
raise IOUError("Adapter {adapter_number} doesn't exist on IOU {name}".format(name=self._name,
adapter_number=adapter_number))
if not adapter.port_exists(port_number):
raise IOUError("Port {port_number} doesn't exist in adapter {adapter}".format(adapter=adapter,
port_number=port_number))
nio = adapter.get_nio(port_number)
nio.stopPacketCapture()
log.info("IOU {name} [id={id}]: stopping packet capture on {adapter_number}/{port_number}".format(name=self._name,
id=self._id,
adapter_number=adapter_number,
port_number=port_number))
if self.is_iouyap_running():
self._update_iouyap_config()
os.kill(self._iouyap_process.pid, signal.SIGHUP)
+15 -5
View File
@@ -23,33 +23,35 @@ Base interface for NIOs.
class NIO(object):
"""
Network Input/Output.
IOU NIO.
"""
def __init__(self):
self._capturing = False
self._pcap_output_file = ""
self._pcap_data_link_type = ""
def startPacketCapture(self, pcap_output_file):
def startPacketCapture(self, pcap_output_file, pcap_data_link_type="DLT_EN10MB"):
"""
:param pcap_output_file: PCAP destination file for the capture
:param pcap_data_link_type: PCAP data link type (DLT_*), default is DLT_EN10MB
"""
self._capturing = True
self._pcap_output_file = pcap_output_file
self._pcap_data_link_type = pcap_data_link_type
def stopPacketCapture(self):
self._capturing = False
self._pcap_output_file = ""
self._pcap_data_link_type = ""
@property
def capturing(self):
"""
Returns either a capture is configured on this NIO.
:returns: boolean
"""
@@ -59,8 +61,16 @@ class NIO(object):
def pcap_output_file(self):
"""
Returns the path to the PCAP output file.
:returns: path to the PCAP output file
"""
return self._pcap_output_file
@property
def pcap_data_link_type(self):
"""
Returns the PCAP data link type
:returns: PCAP data link type (DLT_* value)
"""
return self._pcap_data_link_type