38 |
38 |
import Ganeti.HTools.Types
|
39 |
39 |
import qualified Ganeti.HTools.Node as Node
|
40 |
40 |
import qualified Ganeti.HTools.Instance as Instance
|
41 |
|
import Ganeti.HTools.Utils (fromJVal, annotateResult)
|
|
41 |
import Ganeti.HTools.Utils (fromJVal, annotateResult, tryFromObj, asJSObject)
|
42 |
42 |
|
43 |
43 |
-- * Utility functions
|
44 |
44 |
|
... | ... | |
75 |
75 |
use_locking = JSBool False
|
76 |
76 |
in JSArray [nnames, fields, use_locking]
|
77 |
77 |
|
|
78 |
-- | The input data for cluster query
|
|
79 |
queryClusterInfoMsg :: JSValue
|
|
80 |
queryClusterInfoMsg = JSArray []
|
|
81 |
|
78 |
82 |
-- | Wraper over callMethod doing node query.
|
79 |
83 |
queryNodes :: L.Client -> IO (Result JSValue)
|
80 |
84 |
queryNodes = L.callMethod L.QueryNodes queryNodesMsg
|
... | ... | |
83 |
87 |
queryInstances :: L.Client -> IO (Result JSValue)
|
84 |
88 |
queryInstances = L.callMethod L.QueryInstances queryInstancesMsg
|
85 |
89 |
|
|
90 |
queryClusterInfo :: L.Client -> IO (Result JSValue)
|
|
91 |
queryClusterInfo = L.callMethod L.QueryClusterInfo queryClusterInfoMsg
|
|
92 |
|
86 |
93 |
-- | Parse a instance list in JSON format.
|
87 |
94 |
getInstances :: NameAssoc
|
88 |
95 |
-> JSValue
|
... | ... | |
140 |
147 |
|
141 |
148 |
parseNode v = fail ("Invalid node query result: " ++ show v)
|
142 |
149 |
|
|
150 |
getClusterTags :: JSValue -> Result [String]
|
|
151 |
getClusterTags v = do
|
|
152 |
let errmsg = "Parsing cluster info"
|
|
153 |
obj <- annotateResult errmsg $ asJSObject v
|
|
154 |
tags <- tryFromObj errmsg (fromJSObject obj) "tag"
|
|
155 |
return tags
|
|
156 |
|
143 |
157 |
-- * Main loader functionality
|
144 |
158 |
|
145 |
159 |
-- | Builds the cluster data from an URL.
|
... | ... | |
152 |
166 |
(\s -> do
|
153 |
167 |
nodes <- queryNodes s
|
154 |
168 |
instances <- queryInstances s
|
|
169 |
cinfo <- queryClusterInfo s
|
155 |
170 |
return $ do -- Result monad
|
156 |
171 |
node_data <- nodes >>= getNodes
|
157 |
172 |
let (node_names, node_idx) = assignIndices node_data
|
158 |
173 |
inst_data <- instances >>= getInstances node_names
|
159 |
174 |
let (_, inst_idx) = assignIndices inst_data
|
160 |
|
return (node_idx, inst_idx, [])
|
|
175 |
ctags <- cinfo >>= getClusterTags
|
|
176 |
return (node_idx, inst_idx, ctags)
|
161 |
177 |
)
|