From 427746afb213d1637c22d20c6c10bc3f3ef02ff2 Mon Sep 17 00:00:00 2001 From: Apollon Oikonomopoulos <apollon@noc.grnet.gr> Date: Mon, 18 Apr 2011 17:57:03 +0300 Subject: [PATCH] LUGroupSetParams: handle network map/unmap Modify LUGroupSetParams to accept network addition/removal. Networks are connected to nodegroups' links. Signed-off-by: Apollon Oikonomopoulos <apollon@noc.grnet.gr> --- lib/cmdlib.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ lib/opcodes.py | 1 + 2 files changed, 47 insertions(+) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index eedf8acca..82f9a297a 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 416fae7d1..5a331f140 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)), ] -- GitLab