From 21bcb9aa80a5c2eb671dcba69af795e624a230f7 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Mon, 16 Nov 2009 15:52:53 +0100
Subject: [PATCH] Fix off-by-one error when modifying instance NIC
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

For an instance with exactly one NIC:

$ gnt-instance modify --net 1:ip=1.2.3.4 inst1
Failure: prerequisites not met for this operation:
error type: wrong_input, error details:
Invalid NIC index 1, valid values are 0 to 1

For an instance with no NIC at all, it fails with β€œInvalid NIC index 0, valid
values are 0 to 0”. This is fixed by this patch.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>
---
 lib/cli.py    | 4 ++--
 lib/cmdlib.py | 6 +++++-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/lib/cli.py b/lib/cli.py
index e18ebb252..5e811b5f1 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -1396,7 +1396,7 @@ def GenericInstanceCreate(mode, opts, args):
 
   if opts.nics:
     try:
-      nic_max = max(int(nidx[0])+1 for nidx in opts.nics)
+      nic_max = max(int(nidx[0]) + 1 for nidx in opts.nics)
     except ValueError, err:
       raise errors.OpPrereqError("Invalid NIC index passed: %s" % str(err))
     nics = [{}] * nic_max
@@ -1427,7 +1427,7 @@ def GenericInstanceCreate(mode, opts, args):
     if opts.sd_size is not None:
       opts.disks = [(0, {"size": opts.sd_size})]
     try:
-      disk_max = max(int(didx[0])+1 for didx in opts.disks)
+      disk_max = max(int(didx[0]) + 1 for didx in opts.disks)
     except ValueError, err:
       raise errors.OpPrereqError("Invalid disk index passed: %s" % str(err))
     disks = [{}] * disk_max
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 7ed082ed8..d5bc1ace3 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -7671,10 +7671,14 @@ class LUSetInstanceParams(LogicalUnit):
         continue
       if nic_op != constants.DDM_ADD:
         # an existing nic
+        if not instance.nics:
+          raise errors.OpPrereqError("Invalid NIC index %s, instance has"
+                                     " no NICs" % nic_op,
+                                     errors.ECODE_INVAL)
         if nic_op < 0 or nic_op >= len(instance.nics):
           raise errors.OpPrereqError("Invalid NIC index %s, valid values"
                                      " are 0 to %d" %
-                                     (nic_op, len(instance.nics)),
+                                     (nic_op, len(instance.nics) - 1),
                                      errors.ECODE_INVAL)
         old_nic_params = instance.nics[nic_op].nicparams
         old_nic_ip = instance.nics[nic_op].ip
-- 
GitLab