Statistics
| Branch: | Tag: | Revision:

root / test / hs / Test / Ganeti / Rpc.hs @ 93f1e606

History | View | Annotate | Download (4.5 kB)

1
{-# LANGUAGE TemplateHaskell #-}
2
{-# OPTIONS_GHC -fno-warn-orphans #-}
3

    
4
{-| Unittests for ganeti-htools.
5

    
6
-}
7

    
8
{-
9

    
10
Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
11

    
12
This program is free software; you can redistribute it and/or modify
13
it under the terms of the GNU General Public License as published by
14
the Free Software Foundation; either version 2 of the License, or
15
(at your option) any later version.
16

    
17
This program is distributed in the hope that it will be useful, but
18
WITHOUT ANY WARRANTY; without even the implied warranty of
19
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
General Public License for more details.
21

    
22
You should have received a copy of the GNU General Public License
23
along with this program; if not, write to the Free Software
24
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25
02110-1301, USA.
26

    
27
-}
28

    
29
module Test.Ganeti.Rpc (testRpc) where
30

    
31
import Test.QuickCheck
32
import Test.QuickCheck.Monadic (monadicIO, run, stop)
33

    
34
import Control.Applicative
35
import qualified Data.Map as Map
36

    
37
import Test.Ganeti.TestHelper
38
import Test.Ganeti.TestCommon
39
import Test.Ganeti.Objects (genInst)
40

    
41
import qualified Ganeti.Rpc as Rpc
42
import qualified Ganeti.Objects as Objects
43
import qualified Ganeti.Types as Types
44
import qualified Ganeti.JSON as JSON
45
import Ganeti.Types
46

    
47
instance Arbitrary Rpc.RpcCallInstanceConsoleInfo where
48
  arbitrary = Rpc.RpcCallInstanceConsoleInfo <$> genConsoleInfoCallParams
49

    
50
genStorageUnit :: Gen StorageUnit
51
genStorageUnit = do
52
  storage_type <- arbitrary
53
  storage_key <- genName
54
  storage_es <- arbitrary
55
  return $ addParamsToStorageUnit storage_es (SURaw storage_type storage_key)
56

    
57
genStorageUnits :: Gen [StorageUnit]
58
genStorageUnits = do
59
  num_storage_units <- choose (0, 5)
60
  vectorOf num_storage_units genStorageUnit
61

    
62
genStorageUnitMap :: Gen (Map.Map String [StorageUnit])
63
genStorageUnitMap = do
64
  num_nodes <- choose (0,5)
65
  node_uuids <- vectorOf num_nodes genName
66
  storage_units_list <- vectorOf num_nodes genStorageUnits
67
  return $ Map.fromList (zip node_uuids storage_units_list)
68

    
69
-- FIXME: Generate more interesting hvparams
70
-- | Generate Hvparams
71
genHvParams :: Gen Objects.HvParams
72
genHvParams = return $ JSON.GenericContainer Map.empty
73

    
74
-- | Generate hypervisor specifications to be used for the NodeInfo call
75
genHvSpecs :: Gen [(Types.Hypervisor, Objects.HvParams)]
76
genHvSpecs = do
77
  numhv <- choose (0, 5)
78
  hvs <- vectorOf numhv arbitrary
79
  hvparams <- vectorOf numhv genHvParams
80
  let specs = zip hvs hvparams
81
  return specs
82

    
83
instance Arbitrary Rpc.RpcCallAllInstancesInfo where
84
  arbitrary = Rpc.RpcCallAllInstancesInfo <$> genHvSpecs
85

    
86
instance Arbitrary Rpc.RpcCallInstanceList where
87
  arbitrary = Rpc.RpcCallInstanceList <$> arbitrary
88

    
89
instance Arbitrary Rpc.RpcCallNodeInfo where
90
  arbitrary = Rpc.RpcCallNodeInfo <$> genStorageUnitMap <*> genHvSpecs
91

    
92
-- | Generates per-instance console info params for the 'InstanceConsoleInfo'
93
-- call.
94
genConsoleInfoCallParams :: Gen [(String, Rpc.InstanceConsoleInfoParams)]
95
genConsoleInfoCallParams = do
96
  numInstances <- choose (0, 3)
97
  names <- vectorOf numInstances arbitrary
98
  params <- vectorOf numInstances genInstanceConsoleInfoParams
99
  return $ zip names params
100

    
101
-- | Generates parameters for the console info call, consisting of an instance
102
-- object, node object, 'HvParams', and 'FilledBeParams'.
103
genInstanceConsoleInfoParams :: Gen Rpc.InstanceConsoleInfoParams
104
genInstanceConsoleInfoParams = Rpc.InstanceConsoleInfoParams <$>
105
  genInst <*> arbitrary <*> arbitrary <*> genHvParams <*> arbitrary
106

    
107
-- | Monadic check that, for an offline node and a call that does not support
108
-- offline nodes, we get a OfflineNodeError response.
109
runOfflineTest :: (Rpc.Rpc a b, Eq b, Show b) => a -> Property
110
runOfflineTest call =
111
  forAll (arbitrary `suchThat` Objects.nodeOffline) $ \node -> monadicIO $ do
112
      res <- run $ Rpc.executeRpcCall [node] call
113
      stop $ res ==? [(node, Left Rpc.OfflineNodeError)]
114

    
115
prop_noffl_request_allinstinfo :: Rpc.RpcCallAllInstancesInfo -> Property
116
prop_noffl_request_allinstinfo = runOfflineTest
117

    
118
prop_noffl_request_instconsinfo :: Rpc.RpcCallInstanceConsoleInfo -> Property
119
prop_noffl_request_instconsinfo = runOfflineTest
120

    
121
prop_noffl_request_instlist :: Rpc.RpcCallInstanceList -> Property
122
prop_noffl_request_instlist = runOfflineTest
123

    
124
prop_noffl_request_nodeinfo :: Rpc.RpcCallNodeInfo -> Property
125
prop_noffl_request_nodeinfo = runOfflineTest
126

    
127
testSuite "Rpc"
128
  [ 'prop_noffl_request_allinstinfo
129
  , 'prop_noffl_request_instconsinfo
130
  , 'prop_noffl_request_instlist
131
  , 'prop_noffl_request_nodeinfo
132
  ]