diff --git a/lib/cmdlib.py b/lib/cmdlib.py index eedf8acca0be13dae1dfa09e9850b2253cd44088..82f9a297a42bff718d19b64a4746516ca7cefa94 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -10863,6 +10863,7 @@ class LUGroupSetParams(LogicalUnit): all_changes = [ self.op.ndparams, self.op.alloc_policy, + self.op.network, ] if all_changes.count(None) == len(all_changes): @@ -10877,6 +10878,11 @@ class LUGroupSetParams(LogicalUnit): locking.LEVEL_NODEGROUP: [self.group_uuid], } + if self.op.network: + (self.network_action, self.network_name, + self.network_link) = self.op.network + self.network_uuid = self.cfg.LookupNetwork(self.network_name) + def CheckPrereq(self): """Check prerequisites. @@ -10887,6 +10893,30 @@ class LUGroupSetParams(LogicalUnit): raise errors.OpExecError("Could not retrieve group '%s' (UUID: %s)" % (self.op.group_name, self.group_uuid)) + if self.op.network: + self.network = self.cfg.GetNetwork(self.network_uuid) + if self.network_action == constants.DDM_ADD: + if self.network_uuid in self.group.networks: + raise errors.OpPrereqError("Network '%s' is already mapped" + " to group '%s'" % (self.network_name, + self.group.name), + errors.ECODE_INVAL) + other_networks = [n for n, link in self.group.networks.items() + if link == self.network_link] + for other_uuid in other_networks: + net = self.cfg.GetNetwork(other_uuid) + if net.family == self.network.family: + raise errors.OpPrereqError("There is already another IPv%d network" + " mapped to group '%s': %s" % + (net.family, self.group.name, net.name), + errors.ECODE_INVAL) + elif (self.network_action == constants.DDM_REMOVE and + self.network_uuid not in self.group.networks): + raise errors.OpPrereqError("Network '%s' is not mapped" + " to group '%s'" % (self.network_name, + self.group.name), + errors.ECODE_INVAL) + if self.op.ndparams: new_ndparams = _GetUpdatedParams(self.group.ndparams, self.op.ndparams) utils.ForceDictType(self.op.ndparams, constants.NDS_PARAMETER_TYPES) @@ -10899,6 +10929,7 @@ class LUGroupSetParams(LogicalUnit): env = { "GROUP_NAME": self.op.group_name, "NEW_ALLOC_POLICY": self.op.alloc_policy, + "NETWORK": self.op.network, } mn = self.cfg.GetMasterNode() return env, [mn], [mn] @@ -10916,6 +10947,21 @@ class LUGroupSetParams(LogicalUnit): if self.op.alloc_policy: self.group.alloc_policy = self.op.alloc_policy + if self.op.network: + if self.network_action == constants.DDM_ADD: + self.group.networks[self.network_uuid] = self.network_link + try: + self.cfg.CommitGroupInstanceIps(self.group.uuid, self.network_uuid, + self.network_link, feedback_fn) + except errors.AddressPoolError, e: + raise errors.OpExecError("Failed to commit existing" + " instance IPs: %s" % str(e)) + elif self.network_action == constants.DDM_REMOVE: + network_link = self.group.networks[self.network_uuid] + self.cfg.ReleaseGroupInstanceIps(self.group.uuid, self.network_uuid, + network_link, feedback_fn) + del self.group.networks[self.network_uuid] + self.cfg.Update(self.group, feedback_fn) return result diff --git a/lib/opcodes.py b/lib/opcodes.py index 416fae7d1b33f06bd5a5c46d8d1d1f538c33d5a5..5a331f140d55e814ccf48589493c1e6762e89975 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -1068,6 +1068,7 @@ class OpGroupSetParams(OpCode): ("ndparams", None, ht.TMaybeDict), ("alloc_policy", None, ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES))), + ("network", None, ht.TOr(ht.TNone, ht.TList)), ]