diff options
author | Marco Capitani <m.capitani@nextworks.it> | 2018-03-28 15:46:38 +0200 |
---|---|---|
committer | Marco Capitani <m.capitani@nextworks.it> | 2018-03-28 16:30:06 +0200 |
commit | a95c3b376053ed00f0e7184dbd228598a9aaf50f (patch) | |
tree | 994e3ccbb7ce8baf08dc9b934c63beefa87215f5 /rumba/model.py | |
parent | 9d42e50b99993c3fa5b9724c09dd28be4c528add (diff) | |
download | rumba-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.py | 93 |
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 |