aboutsummaryrefslogtreecommitdiff
path: root/rumba/model.py
diff options
context:
space:
mode:
authorMarco Capitani <m.capitani@nextworks.it>2018-03-28 15:46:38 +0200
committerMarco Capitani <m.capitani@nextworks.it>2018-03-28 16:30:06 +0200
commita95c3b376053ed00f0e7184dbd228598a9aaf50f (patch)
tree994e3ccbb7ce8baf08dc9b934c63beefa87215f5 /rumba/model.py
parent9d42e50b99993c3fa5b9724c09dd28be4c528add (diff)
downloadrumba-a95c3b376053ed00f0e7184dbd228598a9aaf50f.tar.gz
rumba-a95c3b376053ed00f0e7184dbd228598a9aaf50f.zip
model: make link quality changes scriptable
Added method accepting only ints and floats to allow scripting link quality changes (see example-script additions) Also added general purpose `sb.schedule_action` method
Diffstat (limited to 'rumba/model.py')
-rw-r--r--rumba/model.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/rumba/model.py b/rumba/model.py
index 6d0af58..a8d4664 100644
--- a/rumba/model.py
+++ b/rumba/model.py
@@ -189,6 +189,65 @@ class ShimEthDIF(DIF):
def link_quality(self):
self._link_quality.deactivate(self)
+ def set_delay(self, delay=0,
+ jitter=None,
+ correlation=None,
+ distribution=None):
+ """
+ Set the delay parameters of the underlying link.
+ Parameters as in :py:meth:`.Delay.__init__`
+ :param delay: average delay in ms
+ :type delay: :py:class:`int`
+ :param jitter: jitter in ms
+ :type jitter: :py:class:`int`
+ :param correlation: correlation in %
+ :type correlation: :py:class:`int`
+ :param distribution: delay distribution, defaults to a Normal
+ distribution
+ :type distribution: :py:class:`.Distribution`
+ """
+ new_delay = Delay(delay, jitter, correlation, distribution)
+ new_quality = LinkQuality.clone(self.link_quality, delay=new_delay)
+ self.link_quality = new_quality
+
+ def set_loss(self,
+ loss=0,
+ correlation=None):
+ """
+ Set the loss parameter of the underlying link.
+ Parameters as in :py:meth:`.Loss.__init__`
+ :param loss: loss in percentage
+ :type loss: :py:class:`int` or :py:class:`float`
+ :param correlation: correlation in percentage
+ :type correlation: :py:class:`int` or :py:class:`float`
+ """
+ new_loss = Loss(loss, correlation)
+ new_quality = LinkQuality.clone(self.link_quality, loss=new_loss)
+ self.link_quality = new_quality
+
+ def set_rate(self, rate=None):
+ """
+ Set the rate parameter of the underlying link.
+ :param rate: The desired rate in mbps
+ :type rate: :py:class:`int`
+ """
+ new_quality = LinkQuality.clone(self.link_quality, rate=rate)
+ self.link_quality = new_quality
+
+ def set_quality(self, delay, loss, rate):
+ """
+ Configure the basic quality parameters of the
+ underlying link
+ :param delay: the link delay, in ms
+ :type delay: :py:class:`int`
+ :param loss: the link loss, as a percentage
+ :type loss: :py:class:`float` or :py:class:`int`
+ :param rate: the link rate in mbps
+ :type rate: :py:class:`int`
+ """
+ new_quality = LinkQuality(delay, loss, rate)
+ self.link_quality = new_quality
+
# Normal DIF
#
@@ -231,10 +290,14 @@ class Delay(object):
"""
Configure link delay
:param delay: average delay in ms
+ :type delay: :py:class:`int`
:param jitter: jitter in ms
+ :type jitter: :py:class:`int`
:param correlation: correlation in %
+ :type correlation: :py:class:`int`
:param distribution: delay distribution, defaults to a Normal
distribution
+ :type distribution: :py:class:`.Distribution`
"""
if delay < 0:
@@ -290,7 +353,9 @@ class Loss(object):
"""
Configure link loss
:param loss: loss in percentage
+ :type loss: :py:class:`int` or :py:class:`float`
:param correlation: correlation in percentage
+ :type correlation: :py:class:`int` or :py:class:`float`
"""
if loss and (loss < 0 or loss > 100):
raise ValueError("Loss needs to be between 0 and 100")
@@ -321,6 +386,34 @@ class Loss(object):
class LinkQuality(object):
_active = set()
+ @classmethod
+ def clone(cls, old_quality, delay=None, loss=None, rate=None):
+ """
+ Clone old_quality, updating it with the provided parameters
+ if present
+
+ :param old_quality: A :py:class`.LinkQuality` instance to
+ use as a base
+ :type old_quality: :py:class`.LinkQuality`
+ :param delay: Delay object holding delay configuration
+ or number corresponding to delay in ms
+ :type delay: :py:class:`.Delay` or :py:class:`int`
+ :param loss: Loss object holding delay configuration or
+ number corresponding to loss percentage
+ :type loss: :py:class:`.Loss` or :py:class:`float`
+ :param rate: The rate of the link in mbit
+ :type rate: :py:class:`int`
+ :return: a new :py:class`.LinkQuality` instance
+ :rtype :py:class`LinkQuality`
+ """
+ if delay is None:
+ delay = old_quality.delay
+ if loss is None:
+ loss = old_quality.loss
+ if rate is None:
+ rate = old_quality.rate
+ return LinkQuality(delay, loss, rate)
+
def __init__(self, delay=None, loss=None, rate=None):
"""
Link quality configuration