consul-haskell 0.4 → 0.4.2
raw patch · 4 files changed
+35/−12 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Network.Consul.Types: instance Data.Aeson.Types.ToJSON.ToJSON (Data.Either.Either (Data.Text.Internal.Text, Data.Text.Internal.Text) Data.Text.Internal.Text)
Files
- consul-haskell.cabal +1/−1
- src/Network/Consul.hs +7/−4
- src/Network/Consul/Types.hs +0/−4
- tests/Main.hs +27/−3
consul-haskell.cabal view
@@ -1,5 +1,5 @@ name: consul-haskell-version: 0.4+version: 0.4.2 synopsis: A consul client for Haskell description: A consul client for Haskell
src/Network/Consul.hs view
@@ -35,6 +35,7 @@ import Control.Concurrent.Async.Lifted import Control.Concurrent.STM import Control.Exception.Lifted+import Control.Monad (forever) import Control.Monad.IO.Class import Control.Monad.Catch (MonadMask) import Control.Monad.Trans.Control@@ -112,7 +113,7 @@ getSelf _client@ConsulClient{..} = I.getSelf ccManager (I.hostWithScheme _client) ccPort deregisterService :: MonadIO m => ConsulClient -> Text -> m ()-deregisterService _client@ConsulClient{..} = I.deregisterService ccManager (I.hostWithScheme _client) ccPort +deregisterService _client@ConsulClient{..} = I.deregisterService ccManager (I.hostWithScheme _client) ccPort registerService :: MonadIO m => ConsulClient -> RegisterService -> Maybe Datacenter -> m Bool registerService _client@ConsulClient{..} = I.registerService ccManager (I.hostWithScheme _client) ccPort@@ -123,11 +124,14 @@ case r of True -> do mainFunc <- async action++ --this is here instead of the where to prevent typechecking nastiness checkAction <- case rsCheck request of Just(x@(Ttl _)) -> do- a <- async $ ttlFunc x+ a <- async $ forever $ ttlFunc x return $ Just a _ -> return Nothing+ _foo :: () <- wait mainFunc --prevent: 'StM’ is a type function, and may not be injective case checkAction of Just a -> cancel a@@ -182,7 +186,7 @@ case mkv of Just kv -> return $ (maybe False ((sId $ sSession sequencer) ==) $ kvSession kv) && (kvLockIndex kv) == (sLockIndex sequencer) Nothing -> return False-{- + withSequencer :: (MonadBaseControl IO m, MonadIO m, MonadMask m) => ConsulClient -> Sequencer -> m a -> m a -> Int -> Maybe Datacenter -> m a withSequencer client sequencer action lostAction delay dc = withAsync action $ \ mainAsync -> withAsync pulseLock $ \ pulseAsync -> do@@ -194,4 +198,3 @@ case valid of True -> pulseLock False -> lostAction--}
src/Network/Consul/Types.hs view
@@ -292,10 +292,6 @@ instance ToJSON SessionRequest where toJSON (SessionRequest lockDelay name node checks behavior ttl) = object["LockDelay" .= lockDelay, "Name" .= name, "Node" .= (fmap nNode node), "Checks" .= checks, "Behavior" .= behavior, "TTL" .= ttl] -instance ToJSON (Either (Text,Text) Text) where- toJSON (Left (script,interval)) = object ["Script" .= script, "Interval" .= interval]- toJSON (Right ttl) = object ["TTL" .= ttl]- instance ToJSON ServiceResult where toJSON (ServiceResult node addr sid sName sTags sAddress sPort) = object["Node" .= node, "Address" .= addr, "ServiceID" .= sid, "ServiceName" .= sName, "ServiceTags" .= sTags, "ServiceAddress" .= sAddress, "ServicePort" .= sPort]
tests/Main.hs view
@@ -7,7 +7,7 @@ import Data.Maybe import Data.Text (Text) import Data.UUID-import Network.Consul (deleteKey,getKey,getSessionInfo,initializeConsulClient,putKey,withSession,ConsulClient(..))+import Network.Consul (deleteKey,getKey,getSessionInfo,initializeConsulClient,putKey,withSession,ConsulClient(..),runService,getServiceHealth) import Network.Consul.Types import qualified Network.Consul.Internal as I import Network.HTTP.Client@@ -94,7 +94,6 @@ assertEqual "testDeleteKey: Delete Failed" True x2 x3 <- I.getKey ccManager (I.hostWithScheme _client) ccPort "/testDeleteKey" Nothing Nothing Nothing assertEqual "testDeleteKey: Key was not deleted" Nothing x3- print x3 testDeleteRecursive :: TestTree testDeleteRecursive = testCase "testDeleteRecursive" $ do@@ -133,6 +132,10 @@ let req = RegisterService Nothing "testService" ["test"] Nothing (Just $ Ttl "10s") val <- I.registerService ccManager (I.hostWithScheme _client) ccPort req Nothing assertEqual "testRegisterService: Service was not created" val True+ mService <- I.getService ccManager (I.hostWithScheme _client) ccPort "testService" Nothing Nothing+ case mService of+ Just _ -> return ()+ Nothing -> assertFailure "testRegisterService: Service was not found" testGetSelf :: TestTree testGetSelf = testCase "testGetSelf" $ do@@ -266,14 +269,35 @@ cancelAction = return ("Canceled" :: Text) +testRunServiceTtl :: TestTree+testRunServiceTtl = testCase "testRunServiceTtl" $ do+ client@ConsulClient{..} <- initializeConsulClient "localhost" 8500 Nothing+ let register = RegisterService Nothing "testRunServiceTtl" [] (Just 8000) $ Just $ Ttl "10s"+ runService client register (action client) Nothing+ where+ action client = do+ threadDelay 15000000+ mHealth <- getServiceHealth client "testRunServiceTtl"+ case mHealth of+ Nothing -> assertFailure "testRunServiceTtl: No healthcheck was found"+ Just [x] -> do+ let checks = hChecks x+ mapM_ (testCheck) checks+ testCheck check = do+ assertBool "testRunServiceTtl: Check not passing" $ cStatus check == Passing++ sessionWorkflowTests :: TestTree sessionWorkflowTests = testGroup "Session Workflow Tests" [testWithSessionCancel,testSessionMaintained] +runServiceTests :: TestTree+runServiceTests = testGroup "Run Service Tests" [testRunServiceTtl]+ agentTests :: TestTree agentTests = testGroup "Agent Tests" [testGetSelf,testRegisterService] allTests :: TestTree-allTests = testGroup "All Tests" [testInternalSession, internalKVTests, sessionWorkflowTests, agentTests,testHealth, clientKVTests]+allTests = testGroup "All Tests" [testInternalSession, internalKVTests, sessionWorkflowTests, agentTests,testHealth, clientKVTests, runServiceTests] main :: IO () main = defaultMain allTests