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