Add wconfd RPC AddTcpUdpPort. This rpc is
now being used by config mod function AddTcpUdpPort.

Removed config lock from AddTcpUdpPort.

Added a basic AddTcpUdpPort in config_mock
for testing purposes.

Signed-off-by: BSRK Aditya <[email protected]>
---
 lib/config/__init__.py                   |   15 +++------------
 src/Ganeti/WConfd/ConfigModifications.hs |    9 +++++++++
 test/py/testutils/config_mock.py         |    3 +++
 3 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/lib/config/__init__.py b/lib/config/__init__.py
index 991141f..e03db88 100644
--- a/lib/config/__init__.py
+++ b/lib/config/__init__.py
@@ -1097,19 +1097,10 @@ class ConfigWriter(object):
     """
     return self._UnlockedVerifyConfig()
 
-  @ConfigSync()
   def AddTcpUdpPort(self, port):
-    """Adds a new port to the available port pool.
-
-    @warning: this method does not "flush" the configuration (via
-        L{_WriteConfig}); callers should do that themselves once the
-        configuration is stable
-
-    """
-    if not isinstance(port, int):
-      raise errors.ProgrammerError("Invalid type passed for port")
-
-    self._ConfigData().cluster.tcpudp_port_pool.add(port)
+    """Adds a new port to the available port pool."""
+    utils.SimpleRetry(True, self._wconfd.AddTcpUdpPort, 0.1, 30, args=[port])
+    self.OutDate()
 
   @ConfigSync(shared=1)
   def GetPortList(self):
diff --git a/src/Ganeti/WConfd/ConfigModifications.hs 
b/src/Ganeti/WConfd/ConfigModifications.hs
index 7a91d1a..3d02dc6 100644
--- a/src/Ganeti/WConfd/ConfigModifications.hs
+++ b/src/Ganeti/WConfd/ConfigModifications.hs
@@ -521,6 +521,14 @@ allocatePort = do
     (return ())
   return . MaybeForJSON $ maybePort
 
+-- | Adds a new port to the available port pool.
+addTcpUdpPort :: Int -> WConfdMonad Bool
+addTcpUdpPort port =
+  let pL = csConfigDataL . configClusterL . clusterTcpudpPortPoolL
+      f :: Monad m => ConfigState -> m ConfigState
+      f = mapMOf pL (return . (port:) . filter (/= port))
+  in isJust <$> modifyConfigWithLock (const f) (return ())
+
 -- | Mark the status of instance disks active.
 markInstanceDisksActive :: InstanceUUID -> WConfdMonad (MaybeForJSON Instance)
 markInstanceDisksActive iUuid = do
@@ -632,6 +640,7 @@ updateDisk disk = do
 exportedFunctions :: [Name]
 exportedFunctions = [ 'addInstance
                     , 'addInstanceDisk
+                    , 'addTcpUdpPort
                     , 'allocatePort
                     , 'attachInstanceDisk
                     , 'detachInstanceDisk
diff --git a/test/py/testutils/config_mock.py b/test/py/testutils/config_mock.py
index aa36af9..43c09ce 100644
--- a/test/py/testutils/config_mock.py
+++ b/test/py/testutils/config_mock.py
@@ -972,3 +972,6 @@ class ConfigMock(config.ConfigWriter):
 
   def RemoveInstance(self, inst_uuid):
     del self._ConfigData().instances[inst_uuid]
+
+  def AddTcpUdpPort(self, port):
+    self._ConfigData().cluster.tcpudp_port_pool.add(port)
-- 
1.7.10.4

Reply via email to