module Test.Ganeti.Query.Instance
( testQuery_Instance
) where
import qualified Data.ByteString.UTF8 as UTF8
import qualified Data.Map as Map
import qualified Data.Set as Set
import System.Time (ClockTime(..))
import Ganeti.JSON
import Ganeti.Objects
import Ganeti.Query.Instance
import Ganeti.Rpc
import Ganeti.Types
import Test.Ganeti.TestHelper
import Test.HUnit
createInstance :: String -> String -> AdminState -> AdminStateSource -> Instance
createInstance name pnodeUuid adminState adminStateSource =
RealInstance $ RealInstanceData name pnodeUuid "" Kvm
(GenericContainer Map.empty)
(PartialBeParams Nothing Nothing Nothing Nothing Nothing Nothing)
(GenericContainer Map.empty) (GenericContainer Map.empty)
adminState adminStateSource [] [] False Nothing epochTime epochTime
(UTF8.fromString "") 0 Set.empty
where epochTime = TOD 0 0
fakeInstanceInfo :: InstanceInfo
fakeInstanceInfo = InstanceInfo 0 InstanceStateRunning 0 0
responseError :: String -> (String, ERpcError a)
responseError name = (name, Left . RpcResultError $ "Insignificant error")
responseSuccess :: String
-> [String]
-> (String, ERpcError RpcResultAllInstancesInfo)
responseSuccess name instNames = (name, Right .
RpcResultAllInstancesInfo . map (, fakeInstanceInfo) $ instNames)
waldoInstance :: Instance
waldoInstance = createInstance "Waldo" "prim" AdminUp AdminSource
case_nodeOffline :: Assertion
case_nodeOffline =
let responses = [ responseError "prim"
, responseError "second"
, responseSuccess "node" ["NotWaldo", "DefinitelyNotWaldo"]
]
in case getInstanceInfo responses waldoInstance of
Left _ -> return ()
Right _ -> assertFailure
"Error occurred when instance info is missing and node is offline"
case_nodeOnlineNoInfo :: Assertion
case_nodeOnlineNoInfo =
let responses = [ responseSuccess "prim" ["NotWaldo1"]
, responseSuccess "second" ["NotWaldo2"]
, responseError "node"
]
in case getInstanceInfo responses waldoInstance of
Left _ -> assertFailure
"Error occurred when instance info could be found on primary"
Right Nothing -> return ()
Right _ -> assertFailure
"Some instance info found when none should be"
case_infoOnPrimary :: Assertion
case_infoOnPrimary =
let responses = [ responseSuccess "prim" ["NotWaldo1", "Waldo"]
, responseSuccess "second" ["NotWaldo2"]
, responseSuccess "node" ["NotWaldo3"]
]
in case getInstanceInfo responses waldoInstance of
Left _ -> assertFailure
"Cannot retrieve instance info when present on primary node"
Right (Just (_, True)) -> return ()
Right _ -> assertFailure
"Instance info not found on primary node, despite being there"
case_infoOnSecondary :: Assertion
case_infoOnSecondary =
let responses = [ responseSuccess "prim" ["NotWaldo1"]
, responseSuccess "second" ["Waldo", "NotWaldo2"]
, responseError "node"
]
in case getInstanceInfo responses waldoInstance of
Left _ -> assertFailure
"Cannot retrieve instance info when present on secondary node"
Right (Just (_, False)) -> return ()
Right _ -> assertFailure
"Instance info not found on secondary node, despite being there"
testSuite "Query_Instance"
[ 'case_nodeOffline
, 'case_nodeOnlineNoInfo
, 'case_infoOnPrimary
, 'case_infoOnSecondary
]