diff --git a/lib/locking.py b/lib/locking.py index 26345632e400df71a04978ec7271cec4d6eac420..03441408a24043acf5ce1e224a3293ef6b795e01 100644 --- a/lib/locking.py +++ b/lib/locking.py @@ -1389,20 +1389,30 @@ LEVEL_CLUSTER = 0 LEVEL_INSTANCE = 1 LEVEL_NODEGROUP = 2 LEVEL_NODE = 3 +LEVEL_NODE_RES = 4 -LEVELS = [LEVEL_CLUSTER, - LEVEL_INSTANCE, - LEVEL_NODEGROUP, - LEVEL_NODE] +LEVELS = [ + LEVEL_CLUSTER, + LEVEL_INSTANCE, + LEVEL_NODEGROUP, + LEVEL_NODE, + LEVEL_NODE_RES, + ] # Lock levels which are modifiable -LEVELS_MOD = [LEVEL_NODE, LEVEL_NODEGROUP, LEVEL_INSTANCE] +LEVELS_MOD = frozenset([ + LEVEL_NODE_RES, + LEVEL_NODE, + LEVEL_NODEGROUP, + LEVEL_INSTANCE, + ]) LEVEL_NAMES = { LEVEL_CLUSTER: "cluster", LEVEL_INSTANCE: "instance", LEVEL_NODEGROUP: "nodegroup", LEVEL_NODE: "node", + LEVEL_NODE_RES: "nodes-res", } # Constant for the big ganeti lock @@ -1443,6 +1453,7 @@ class GanetiLockManager: self.__keyring = { LEVEL_CLUSTER: LockSet([BGL], "BGL", monitor=self._monitor), LEVEL_NODE: LockSet(nodes, "nodes", monitor=self._monitor), + LEVEL_NODE_RES: LockSet(nodes, "nodes-res", monitor=self._monitor), LEVEL_NODEGROUP: LockSet(nodegroups, "nodegroups", monitor=self._monitor), LEVEL_INSTANCE: LockSet(instances, "instances", monitor=self._monitor), diff --git a/lib/server/masterd.py b/lib/server/masterd.py index cc86d8a13f2d8cdd1292da42bf2521300ca3a2ac..198a8991928841dca266e1e77463b0dcb26ae261 100644 --- a/lib/server/masterd.py +++ b/lib/server/masterd.py @@ -429,6 +429,7 @@ class GanetiContext(object): # Add the new node to the Ganeti Lock Manager self.glm.add(locking.LEVEL_NODE, node.name) + self.glm.add(locking.LEVEL_NODE_RES, node.name) def ReaddNode(self, node): """Updates a node that's already in the configuration @@ -449,6 +450,7 @@ class GanetiContext(object): # Remove the node from the Ganeti Lock Manager self.glm.remove(locking.LEVEL_NODE, name) + self.glm.remove(locking.LEVEL_NODE_RES, name) def _SetWatcherPause(until):