.. so that they can be persisted.

Signed-off-by: Petr Pudlak <[email protected]>
---
 src/Ganeti/Utils/MultiMap.hs |  5 +++++
 src/Ganeti/WConfd/TempRes.hs | 19 ++++++++++++-------
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/Ganeti/Utils/MultiMap.hs b/src/Ganeti/Utils/MultiMap.hs
index 26243f5..714f9d2 100644
--- a/src/Ganeti/Utils/MultiMap.hs
+++ b/src/Ganeti/Utils/MultiMap.hs
@@ -52,6 +52,7 @@ import qualified Data.Map as M
 import Data.Maybe (fromMaybe, isJust)
 import Data.Monoid
 import qualified Data.Set as S
+import qualified Text.JSON as J
 
 import Ganeti.Lens
 
@@ -68,6 +69,10 @@ instance (Ord v, Ord k) => Monoid (MultiMap k v) where
 instance F.Foldable (MultiMap k) where
   foldMap f = F.foldMap (F.foldMap f) . getMultiMap
 
+instance (J.JSON k, Ord k, J.JSON v, Ord v) => J.JSON (MultiMap k v) where
+  showJSON = J.showJSON . getMultiMap
+  readJSON = liftM MultiMap . J.readJSON
+
 -- | A 'Lens' that allows to access a set under a given key in a multi-map.
 multiMapL :: (Ord k, Ord v) => k -> Lens' (MultiMap k v) (S.Set v)
 multiMapL k f = fmap MultiMap
diff --git a/src/Ganeti/WConfd/TempRes.hs b/src/Ganeti/WConfd/TempRes.hs
index a2b32e4..110d5e3 100644
--- a/src/Ganeti/WConfd/TempRes.hs
+++ b/src/Ganeti/WConfd/TempRes.hs
@@ -63,6 +63,7 @@ import qualified Data.Map as M
 import Data.Monoid
 import qualified Data.Set as S
 import System.Random
+import qualified Text.JSON as J
 
 import Ganeti.BasicTypes
 import Ganeti.Config
@@ -72,6 +73,7 @@ import qualified Ganeti.JSON as J
 import Ganeti.Lens
 import Ganeti.Locking.Locks (ClientId)
 import Ganeti.Objects
+import Ganeti.THH
 import Ganeti.Utils
 import Ganeti.Utils.MonadPlus
 import Ganeti.Utils.Random
@@ -106,14 +108,17 @@ instance (Ord j, Ord a) => Monoid (TempRes j a) where
   mempty = TempRes mempty
   mappend (TempRes x) (TempRes y) = TempRes $ x <> y
 
+instance (J.JSON j, Ord j, J.JSON a, Ord a) => J.JSON (TempRes j a) where
+  showJSON = J.showJSON . getTempRes
+  readJSON = liftM TempRes . J.readJSON
+
 -- | The state of the temporary reservations
-data TempResState = TempResState
-  { trsDRBD :: DRBDMap
-  , trsMACs :: TempRes ClientId MAC
-  , trsDRBDSecrets :: TempRes ClientId DRBDSecret
-  , trsLVs :: TempRes ClientId LogicalVolume
-  }
-  deriving (Eq, Show)
+$(buildObject "TempResState" "trs" $
+  [ simpleField "dRBD"             [t| DRBDMap |]
+  , simpleField "mACs"             [t| TempRes ClientId MAC |]
+  , simpleField "dRBDSecrets"      [t| TempRes ClientId DRBDSecret |]
+  , simpleField "lVs"              [t| TempRes ClientId LogicalVolume |]
+  ])
 
 emptyTempResState :: TempResState
 emptyTempResState = TempResState M.empty mempty mempty mempty
-- 
2.0.0.526.g5318336

Reply via email to