This corresponds to the currents IP reservation methods in ConfigWriter.
Signed-off-by: Petr Pudlak <[email protected]>
---
src/Ganeti/WConfd/Core.hs | 48 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 47 insertions(+), 1 deletion(-)
diff --git a/src/Ganeti/WConfd/Core.hs b/src/Ganeti/WConfd/Core.hs
index b73a0fc..330a4f9 100644
--- a/src/Ganeti/WConfd/Core.hs
+++ b/src/Ganeti/WConfd/Core.hs
@@ -44,7 +44,7 @@ import qualified Ganeti.Locking.Allocation as L
import Ganeti.Locking.Locks ( GanetiLocks(ConfigLock), LockLevel(LevelConfig)
, lockLevel, LockLevel, ClientId )
import qualified Ganeti.Locking.Waiting as LW
-import Ganeti.Objects (ConfigData, DRBDSecret, LogicalVolume)
+import Ganeti.Objects (ConfigData, DRBDSecret, LogicalVolume, Ip4Address)
import qualified Ganeti.WConfd.ConfigVerify as V
import Ganeti.WConfd.Language
import Ganeti.WConfd.Monad
@@ -177,6 +177,45 @@ generateDRBDSecret cid = do
reserveLV :: ClientId -> LogicalVolume -> WConfdMonad ()
reserveLV jobId lv = modifyTempResStateErr $ T.reserveLV jobId lv
+-- *** IPv4s
+
+-- | Reserve a given IPv4 address for use by an instance.
+reserveIp :: ClientId -> T.NetworkUUID -> Ip4Address -> Bool -> WConfdMonad ()
+reserveIp = (((modifyTempResStateErr .) .) .) . T.reserveIp
+
+-- | Give a specific IP address back to an IP pool.
+-- The IP address is returned to the IP pool designated by network id
+-- and marked as reserved.
+releaseIp :: ClientId -> T.NetworkUUID -> Ip4Address -> WConfdMonad ()
+releaseIp = (((modifyTempResStateErr .) const .) .) . T.releaseIp
+
+-- Find a free IPv4 address for an instance and reserve it.
+generateIp :: ClientId -> T.NetworkUUID -> WConfdMonad Ip4Address
+generateIp = (modifyTempResStateErr .) . T.generateIp
+
+-- | Commit all reserved/released IP address to an IP pool.
+-- The IP addresses are taken from the network's IP pool and marked as
+-- reserved/free for instances.
+--
+-- Note that the reservations are kept, they are supposed to be cleaned
+-- when a job finishes.
+commitTemporaryIps :: ClientId -> WConfdMonad ()
+commitTemporaryIps = modifyConfigDataErr_ . T.commitReservedIps
+
+-- | Immediately release an IP address, without using the reservations pool.
+commitReleaseTemporaryIp
+ :: T.NetworkUUID -> Ip4Address -> WConfdMonad ()
+commitReleaseTemporaryIp net_uuid addr =
+ modifyConfigDataErr_ (const $ T.commitReleaseIp net_uuid addr)
+
+-- | List all IP reservations for the current client.
+--
+-- This function won't be needed once the corresponding calls are moved to
+-- WConfd.
+listReservedIps :: ClientId -> WConfdMonad [T.IPv4Reservation]
+listReservedIps jobId =
+ liftM (S.toList . T.listReservedIps jobId . snd) readTempResState
+
-- ** Locking related functions
-- | List the locks of a given owner (i.e., a job-id lockfile pair).
@@ -277,6 +316,13 @@ exportedFunctions = [ 'echo
, 'generateDRBDSecret
-- LVs
, 'reserveLV
+ -- IPv4s
+ , 'reserveIp
+ , 'releaseIp
+ , 'generateIp
+ , 'commitTemporaryIps
+ , 'commitReleaseTemporaryIp
+ , 'listReservedIps
-- locking
, 'listLocks
, 'listAllLocks
--
2.0.0.526.g5318336