Ema has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/367903 )

Change subject: Add support for One-packet scheduling (OPS)
......................................................................


Add support for One-packet scheduling (OPS)

Add a new boolean service configuration parameter, `ops`, defaulting to
False. The parameter can only be True for UDP services, and enables
One-packet scheduling. With OPS, a new scheduling decision is made for
every packet, hopefully avoiding the issues LVS has when tracking "UDP
connections".

Ref: http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.UDP.html
Change-Id: If643710b99b2eadd1874c4e125f354e3773bed0d
---
M pybal/ipvs.py
M pybal/main.py
M pybal/test/test_ipvs.py
3 files changed, 34 insertions(+), 8 deletions(-)

Approvals:
  Ema: Looks good to me, approved
  BBlack: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/pybal/ipvs.py b/pybal/ipvs.py
index eda6474..8365e50 100644
--- a/pybal/ipvs.py
+++ b/pybal/ipvs.py
@@ -100,6 +100,10 @@
         if len(service) > 3:
             cmd += ' -s ' + service[3]
 
+            # One-packet scheduling
+            if len(service) > 4 and service[4]:
+                cmd += ' -o'
+
         return cmd
 
     @classmethod
@@ -162,7 +166,7 @@
     SVC_SCHEDULERS = ('rr', 'wrr', 'lc', 'wlc', 'lblc', 'lblcr', 'dh', 'sh',
                       'sed', 'nq')
 
-    def __init__(self, name, (protocol, ip, port, scheduler), configuration):
+    def __init__(self, name, (protocol, ip, port, scheduler, ops), 
configuration):
         """Constructor"""
 
         self.name = name
@@ -172,10 +176,16 @@
                 scheduler not in self.SVC_SCHEDULERS):
             raise ValueError('Invalid protocol or scheduler')
 
+        if protocol == 'tcp' and ops:
+            raise ValueError(
+                'OPS can only be used with UDP virtual services')
+
         self.protocol = protocol
         self.ip = ip
         self.port = port
         self.scheduler = scheduler
+        # Boolean to toggle "One-packet scheduling"
+        self.ops = ops
 
         self.configuration = configuration
 
@@ -189,10 +199,10 @@
         self.createService()
 
     def service(self):
-        """Returns a tuple (protocol, ip, port, scheduler) that
+        """Returns a tuple (protocol, ip, port, scheduler, ops) that
         describes this LVS instance."""
 
-        return (self.protocol, self.ip, self.port, self.scheduler)
+        return (self.protocol, self.ip, self.port, self.scheduler, self.ops)
 
     def createService(self):
         """Initializes this LVS instance in LVS."""
diff --git a/pybal/main.py b/pybal/main.py
index b0184a9..65b38e1 100755
--- a/pybal/main.py
+++ b/pybal/main.py
@@ -13,7 +13,7 @@
 import logging
 import signal
 
-from ConfigParser import SafeConfigParser
+from ConfigParser import SafeConfigParser, NoOptionError
 
 from twisted.internet import reactor
 
@@ -85,11 +85,16 @@
 
         for section in config.sections():
             if section != 'global':
+                try:
+                    ops = config.getboolean(section, 'ops')
+                except NoOptionError:
+                    ops = False
                 cfgtuple = (
                     config.get(section, 'protocol'),
                     config.get(section, 'ip'),
                     config.getint(section, 'port'),
-                    config.get(section, 'scheduler'))
+                    config.get(section, 'scheduler'),
+                    ops)
 
             # Read the custom configuration options of the LVS section
             configdict = util.ConfigDict(config.items(section))
diff --git a/pybal/test/test_ipvs.py b/pybal/test/test_ipvs.py
index 45da486..c53ff21 100644
--- a/pybal/test/test_ipvs.py
+++ b/pybal/test/test_ipvs.py
@@ -104,7 +104,7 @@
     def setUp(self):
         super(LVSServiceTestCase, self).setUp()
         self.config['dryrun'] = 'true'
-        self.service = ('tcp', '127.0.0.1', 80, 'rr')
+        self.service = ('tcp', '127.0.0.1', 80, 'rr', False)
         pybal.bgpfailover.BGPFailover.prefixes.clear()
 
         def stubbedModifyState(cls, cmdList):
@@ -120,12 +120,16 @@
     def testConstructor(self):
         """Test `LVSService.__init__`."""
         with self.assertRaises(ValueError):
-            service = ('invalid-protocol', '127.0.0.1', 80, 'rr')
+            service = ('invalid-protocol', '127.0.0.1', 80, 'rr', False)
             pybal.ipvs.LVSService('invalid-protocol', service, self.config)
 
         with self.assertRaises(ValueError):
-            service = ('tcp', '127.0.0.1', 80, 'invalid-scheduler')
+            service = ('tcp', '127.0.0.1', 80, 'invalid-scheduler', False)
             pybal.ipvs.LVSService('invalid-scheduler', service, self.config)
+
+        with self.assertRaises(ValueError):
+            service = ('tcp', '127.0.0.1', 80, 'rr', True)
+            pybal.ipvs.LVSService('ops-with-tcp', service, self.config)
 
         self.config['bgp'] = 'true'
         pybal.ipvs.LVSService('http', self.service, self.config)
@@ -142,6 +146,13 @@
         self.assertEquals(lvs_service.ipvsManager.cmdList,
                           ['-D -t 127.0.0.1:80', '-A -t 127.0.0.1:80 -s rr'])
 
+    def testCreateServiceOps(self):
+        """Test `LVSService.createService`."""
+        service = ('udp', '127.0.0.1', 53, 'rr', True)
+        lvs_service = pybal.ipvs.LVSService('dns', service, self.config)
+        self.assertEquals(lvs_service.ipvsManager.cmdList,
+            ['-D -u 127.0.0.1:53', '-A -u 127.0.0.1:53 -s rr -o'])
+
     def testAssignServers(self):
         """Test `LVSService.assignServers`."""
         lvs_service = pybal.ipvs.LVSService('http', self.service, self.config)

-- 
To view, visit https://gerrit.wikimedia.org/r/367903
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: If643710b99b2eadd1874c4e125f354e3773bed0d
Gerrit-PatchSet: 2
Gerrit-Project: operations/debs/pybal
Gerrit-Branch: master
Gerrit-Owner: Ema <e...@wikimedia.org>
Gerrit-Reviewer: BBlack <bbl...@wikimedia.org>
Gerrit-Reviewer: Ema <e...@wikimedia.org>
Gerrit-Reviewer: Giuseppe Lavagetto <glavage...@wikimedia.org>
Gerrit-Reviewer: Volans <rcocci...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to