transient-universe-0.3.4: src/Transient/Move/Services/MonitorService.hs
-----------------------------------------------------------------------------
--
-- Module : Transient.Move.Services.MonitorService
-- Copyright :
-- License : MIT
--
-- Maintainer : agocorona@gmail.com
-- Stability :
-- Portability :
--
-- |
--
-----------------------------------------------------------------------------
module Main where
import Transient.Base
import Transient.Move
import Transient.Move.Utils
import Transient.Move.Services
import Control.Applicative
import Control.Monad.IO.Class
import Data.List ((\\))
main = keep . runCloud $ do
runService monitorService $ \(ident,service) -> do
mnode <- (local $ findInNodes service >>= return . Just . head) <|>
requestInstall ident service
return (mnode :: Maybe Node)
where
installHere ident service@(package,program)= local $ do
thisNode <- getMyNode
yn<- authorizeService ident service -- !> "AUTHORIZE"
if yn
then do
node <- liftIO $ do
port <- freePort
putStr "Monitor: installing " >> putStrLn package
install package program (nodeHost thisNode) port
putStrLn "INSTALLED"
nodeService thisNode port service
addNodes [node]
return $ Just node
else return Nothing
requestInstall :: String -> Service -> Cloud (Maybe Node)
requestInstall ident service= do
mnode <- installHere ident service -- !> "INSTALLHERE"
case mnode of
Nothing -> installThere ident service
justnode -> return justnode
installThere ident service= do
nodes <- onAll $ findInNodes monitorService -- !> "installThere"
mynode <- onAll getMyNode -- !> nodes
request $ nodes \\ [mynode]
where
request []= empty
request (n:ns)= do
mnode <- callService' ident n (ident,service) -- !> ("calling",n)
case mnode of
Nothing -> request ns
justnode -> return justnode