Revision 9d5b1371 lib/cmdlib.py
b/lib/cmdlib.py | ||
---|---|---|
10220 | 10220 |
|
10221 | 10221 |
# We want to lock all the affected nodes and groups. We have readily |
10222 | 10222 |
# available the list of nodes, and the *destination* group. To gather the |
10223 |
# list of "source" groups, we need to fetch node information. |
|
10224 |
self.node_data = self.cfg.GetAllNodesInfo() |
|
10225 |
affected_groups = set(self.node_data[node].group for node in self.op.nodes) |
|
10226 |
affected_groups.add(self.group_uuid) |
|
10227 |
|
|
10223 |
# list of "source" groups, we need to fetch node information later on. |
|
10228 | 10224 |
self.needed_locks = { |
10229 |
locking.LEVEL_NODEGROUP: list(affected_groups),
|
|
10225 |
locking.LEVEL_NODEGROUP: set([self.group_uuid]),
|
|
10230 | 10226 |
locking.LEVEL_NODE: self.op.nodes, |
10231 | 10227 |
} |
10232 | 10228 |
|
10229 |
def DeclareLocks(self, level): |
|
10230 |
if level == locking.LEVEL_NODEGROUP: |
|
10231 |
assert len(self.needed_locks[locking.LEVEL_NODEGROUP]) == 1 |
|
10232 |
|
|
10233 |
# Try to get all affected nodes' groups without having the group or node |
|
10234 |
# lock yet. Needs verification later in the code flow. |
|
10235 |
groups = self.cfg.GetNodeGroupsFromNodes(self.op.nodes) |
|
10236 |
|
|
10237 |
self.needed_locks[locking.LEVEL_NODEGROUP].update(groups) |
|
10238 |
|
|
10233 | 10239 |
def CheckPrereq(self): |
10234 | 10240 |
"""Check prerequisites. |
10235 | 10241 |
|
10236 | 10242 |
""" |
10243 |
assert self.needed_locks[locking.LEVEL_NODEGROUP] |
|
10244 |
assert (frozenset(self.acquired_locks[locking.LEVEL_NODE]) == |
|
10245 |
frozenset(self.op.nodes)) |
|
10246 |
|
|
10247 |
expected_locks = (set([self.group_uuid]) | |
|
10248 |
self.cfg.GetNodeGroupsFromNodes(self.op.nodes)) |
|
10249 |
actual_locks = self.acquired_locks[locking.LEVEL_NODEGROUP] |
|
10250 |
if actual_locks != expected_locks: |
|
10251 |
raise errors.OpExecError("Nodes changed groups since locks were acquired," |
|
10252 |
" current groups are '%s', used to be '%s'" % |
|
10253 |
(utils.CommaJoin(expected_locks), |
|
10254 |
utils.CommaJoin(actual_locks))) |
|
10255 |
|
|
10256 |
self.node_data = self.cfg.GetAllNodesInfo() |
|
10237 | 10257 |
self.group = self.cfg.GetNodeGroup(self.group_uuid) |
10238 | 10258 |
instance_data = self.cfg.GetAllInstancesInfo() |
10239 | 10259 |
|
... | ... | |
10269 | 10289 |
for node in self.op.nodes: |
10270 | 10290 |
self.node_data[node].group = self.group_uuid |
10271 | 10291 |
|
10292 |
# FIXME: Depends on side-effects of modifying the result of |
|
10293 |
# C{cfg.GetAllNodesInfo} |
|
10294 |
|
|
10272 | 10295 |
self.cfg.Update(self.group, feedback_fn) # Saves all modified nodes. |
10273 | 10296 |
|
10274 | 10297 |
@staticmethod |
Also available in: Unified diff