let vm_capable' = fromMaybe True vm_capable
gidx <- lookupGroup ktg n guuid
node <- if offline || drained || not vm_capable'
- then return $ Node.create n 0 0 0 0 0 0 True 0 gidx
+ then return $ Node.create n 0 0 0 0 0 0 True 0 gidx False
else do
mtotal <- extract "total_memory"
mnode <- extract "reserved_memory"
ndparams <- extract "ndparams" >>= asJSObject
spindles <- tryFromObj desc (fromJSObject ndparams)
"spindle_count"
+ excl_stor <- tryFromObj desc (fromJSObject ndparams)
+ "exclusive_storage"
return $ Node.create n mtotal mnode mfree
- dtotal dfree ctotal False spindles gidx
+ dtotal dfree ctotal False spindles gidx excl_stor
return (n, node)
-- | Parses a group as found in the cluster group list.
L.Query (Qlang.ItemTypeOpCode Qlang.QRNode)
["name", "mtotal", "mnode", "mfree", "dtotal", "dfree",
"ctotal", "offline", "drained", "vm_capable",
- "ndp/spindle_count", "group.uuid", "tags"] Qlang.EmptyFilter
+ "ndp/spindle_count", "group.uuid", "tags",
+ "ndp/exclusive_storage"] Qlang.EmptyFilter
-- | The input data for instance query.
queryInstancesMsg :: L.LuxiOp
-- | Construct a node from a JSON object.
parseNode :: NameAssoc -> [(JSValue, JSValue)] -> Result (String, Node.Node)
parseNode ktg [ name, mtotal, mnode, mfree, dtotal, dfree
- , ctotal, offline, drained, vm_capable, spindles, g_uuid
- , tags ]
+ , ctotal, offline, drained, vm_capable, spindles, g_uuid
+ , tags, excl_stor ]
= do
xname <- annotateResult "Parsing new node" (fromJValWithStatus name)
let convert a = genericConvert "Node" xname a
xspindles <- convert "spindles" spindles
xgdx <- convert "group.uuid" g_uuid >>= lookupGroup ktg xname
xtags <- convert "tags" tags
+ xexcl_stor <- convert "exclusive_storage" excl_stor
node <- if xoffline || xdrained || not xvm_capable
- then return $ Node.create xname 0 0 0 0 0 0 True xspindles xgdx
+ then return $
+ Node.create xname 0 0 0 0 0 0 True xspindles xgdx False
else do
xmtotal <- convert "mtotal" mtotal
xmnode <- convert "mnode" mnode
xctotal <- convert "ctotal" ctotal
return . flip Node.setNodeTags xtags $
Node.create xname xmtotal xmnode xmfree xdtotal xdfree
- xctotal False xspindles xgdx
+ xctotal False xspindles xgdx xexcl_stor
return (xname, node)
parseNode _ v = fail ("Invalid node query result: " ++ show v)
let vm_cap' = fromMaybe True vm_cap
ndparams <- extract "ndparams" >>= asJSObject
spindles <- tryFromObj desc (fromJSObject ndparams) "spindle_count"
+ excl_stor <- tryFromObj desc (fromJSObject ndparams) "exclusive_storage"
guuid <- annotateResult desc $ maybeFromObj a "group.uuid"
guuid' <- lookupGroup ktg name (fromMaybe defaultGroupID guuid)
node <- if offline || drained || not vm_cap'
- then return $ Node.create name 0 0 0 0 0 0 True 0 guuid'
+ then return $ Node.create name 0 0 0 0 0 0 True 0 guuid' False
else do
mtotal <- extract "mtotal"
mnode <- extract "mnode"
tags <- extract "tags"
return . flip Node.setNodeTags tags $
Node.create name mtotal mnode mfree dtotal dfree ctotal False
- spindles guuid'
+ spindles guuid' excl_stor
return (name, node)
-- | Construct a group from a JSON object.
{-
-Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
+Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-- | Parse the string description into nodes.
parseDesc :: String -> [String]
- -> Result (AllocPolicy, Int, Int, Int, Int, Int)
-parseDesc _ [a, n, d, m, c, s] = do
+ -> Result (AllocPolicy, Int, Int, Int, Int, Int, Bool)
+parseDesc _ [a, n, d, m, c, s, exstor] = do
apol <- allocPolicyFromRaw a `mplus` apolAbbrev a
ncount <- tryRead "node count" n
disk <- annotateResult "disk size" (parseUnit d)
mem <- annotateResult "memory size" (parseUnit m)
cpu <- tryRead "cpu count" c
spindles <- tryRead "spindles" s
- return (apol, ncount, disk, mem, cpu, spindles)
+ excl_stor <- tryRead "exclusive storage" exstor
+ return (apol, ncount, disk, mem, cpu, spindles, excl_stor)
parseDesc desc [a, n, d, m, c] = parseDesc desc [a, n, d, m, c, "1"]
+parseDesc desc [a, n, d, m, c, s] = parseDesc desc [a, n, d, m, c, s, "False"]
+
parseDesc desc es =
fail $ printf
"Invalid cluster specification, expected 6 comma-separated\
-> String -- ^ The group specification
-> Result (Group.Group, [Node.Node])
createGroup grpIndex spec = do
- (apol, ncount, disk, mem, cpu, spindles) <- parseDesc spec $
- sepSplit ',' spec
+ (apol, ncount, disk, mem, cpu, spindles, excl_stor) <- parseDesc spec $
+ sepSplit ',' spec
let nodes = map (\idx ->
flip Node.setMaster (grpIndex == 1 && idx == 1) $
Node.create (printf "node-%02d-%03d" grpIndex idx)
(fromIntegral mem) 0 mem
(fromIntegral disk) disk
- (fromIntegral cpu) False spindles grpIndex
+ (fromIntegral cpu) False spindles grpIndex excl_stor
) [1..ncount]
-- TODO: parse networks to which this group is connected
grp = Group.create (printf "group-%02d" grpIndex)
-> Node.Node -- ^ The node to be serialised
-> String
serializeNode gl node =
- printf "%s|%.0f|%d|%d|%.0f|%d|%.0f|%c|%s|%d|%s" (Node.name node)
+ printf "%s|%.0f|%d|%d|%.0f|%d|%.0f|%c|%s|%d|%s|%s" (Node.name node)
(Node.tMem node) (Node.nMem node) (Node.fMem node)
(Node.tDsk node) (Node.fDsk node) (Node.tCpu node)
(if Node.offline node then 'Y' else
(Group.uuid grp)
(Node.spindleCount node)
(intercalate "," (Node.nTags node))
+ (if Node.exclStorage node then "Y" else "N")
where grp = Container.find (Node.group node) gl
-- | Generate node file data from node objects.
-> [String] -- ^ Input data as a list of fields
-> m (String, Node.Node) -- ^ The result, a tuple o node name
-- and node object
-loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu, spindles, tags] = do
+loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu, spindles, tags,
+ excl_stor] = do
gdx <- lookupGroup ktg name gu
new_node <-
if "?" `elem` [tm,nm,fm,td,fd,tc] || fo == "Y" then
- return $ Node.create name 0 0 0 0 0 0 True 0 gdx
+ return $ Node.create name 0 0 0 0 0 0 True 0 gdx False
else do
let vtags = commaSplit tags
vtm <- tryRead name tm
vfd <- tryRead name fd
vtc <- tryRead name tc
vspindles <- tryRead name spindles
+ vexcl_stor <- case excl_stor of
+ "Y" -> return True
+ "N" -> return False
+ _ -> fail $
+ "Invalid exclusive_storage value for node '" ++
+ name ++ "': " ++ excl_stor
return . flip Node.setMaster (fo == "M") . flip Node.setNodeTags vtags $
Node.create name vtm vnm vfm vtd vfd vtc False vspindles gdx
+ vexcl_stor
return (name, new_node)
loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu] =
loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu, spindles] =
loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu, spindles, ""]
+loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu, spindles, tags] =
+ loadNode ktg [name, tm, nm, fm, td, fd, tc, fo, gu, spindles, tags, "N"]
+
loadNode _ s = fail $ "Invalid/incomplete node data: '" ++ show s ++ "'"
-- | Load an instance from a field list.
, pTags :: TagMap -- ^ Primary instance exclusion tags and their count
, group :: T.Gdx -- ^ The node's group (index)
, iPolicy :: T.IPolicy -- ^ The instance policy (of the node's group)
+ , exclStorage :: Bool -- ^ Effective value of exclusive_storage
} deriving (Show, Eq)
instance T.Element Node where
-- The index and the peers maps are empty, and will be need to be
-- update later via the 'setIdx' and 'buildPeers' functions.
create :: String -> Double -> Int -> Int -> Double
- -> Int -> Double -> Bool -> Int -> T.Gdx -> Node
+ -> Int -> Double -> Bool -> Int -> T.Gdx -> Bool -> Node
create name_init mem_t_init mem_n_init mem_f_init
dsk_t_init dsk_f_init cpu_t_init offline_init spindles_init
- group_init =
+ group_init excl_stor =
Node { name = name_init
, alias = name_init
, tMem = mem_t_init
, pTags = Map.empty
, group = group_init
, iPolicy = T.defIPolicy
+ , exclStorage = excl_stor
}
-- | Conversion formula from mDsk\/tDsk to loDsk.
"free_memory": 31389,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31746,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31234,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 22914,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 4096,
"group": "uuid-group-1",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 4096,
"group": "uuid-group-2",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 31389,
"group": "uuid-group-1",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 3840,
"group": "uuid-group-1",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 3968,
"group": "uuid-group-1",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 4096,
"group": "uuid-group-2",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 4096,
"group": "uuid-group-2",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 31389,
"group": "uuid-group-1",
"ndparams": {
- "spindle_count": 1
+ "spindle_count": 1,
+ "exclusive_storage": false
},
"offline": false,
"reserved_memory": 1017,
"free_memory": 31389,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31234,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 22914,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31746,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31746,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31389,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31746,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31234,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 22914,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31389,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31746,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 31234,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"free_memory": 22914,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
},
"reserved_memory": 1017,
"master_capable": true,
"vm_capable": true,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
}
},
{
"vm_capable": true,
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
}
},
{
],
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
}
},
{
],
"ndparams": {
"spindle_count": 1,
- "oob_program": null
+ "oob_program": null,
+ "exclusive_storage": false
}
}
]
{-
-Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
+Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
cpu_t <- choose (base_cpu, top_cpu)
offl <- arbitrary
let n = Node.create name (fromIntegral mem_t) mem_n mem_f
- (fromIntegral dsk_t) dsk_f (fromIntegral cpu_t) offl 1 0
+ (fromIntegral dsk_t) dsk_f (fromIntegral cpu_t) offl 1 0 False
n' = Node.setPolicy nullIPolicy n
return $ Node.buildPeers n' Container.empty