Use 'GetInstanceSecondaryNodes' to get the secondary nodes of an
instance, instead of the 'secondary_nodes'.
Annotate 'secondary_nodes' in rpc so that backend has access to it.

Signed-off-by: Ilias Tsitsimpis <[email protected]>
---
 lib/cmdlib/backup.py             |  2 +-
 lib/cmdlib/base.py               |  2 +-
 lib/cmdlib/cluster.py            | 13 +++++++------
 lib/cmdlib/group.py              |  3 ++-
 lib/cmdlib/instance.py           | 16 ++++++++++------
 lib/cmdlib/instance_migration.py | 17 +++++++++++------
 lib/cmdlib/instance_query.py     |  5 +++--
 lib/cmdlib/instance_storage.py   | 19 +++++++++++--------
 lib/cmdlib/instance_utils.py     |  2 +-
 lib/cmdlib/node.py               |  3 ++-
 lib/cmdlib/test.py               |  3 ++-
 lib/config.py                    |  4 ++--
 lib/masterd/iallocator.py        |  6 ++++--
 lib/objects.py                   | 14 +-------------
 lib/rpc/node.py                  |  1 +
 test/py/ganeti.query_unittest.py |  9 +++++++++
 test/py/ganeti.rpc_unittest.py   |  3 +++
 17 files changed, 71 insertions(+), 51 deletions(-)

diff --git a/lib/cmdlib/backup.py b/lib/cmdlib/backup.py
index 4787e3d..0bfdfeb 100644
--- a/lib/cmdlib/backup.py
+++ b/lib/cmdlib/backup.py
@@ -314,7 +314,7 @@ class LUBackupExport(LogicalUnit):
         raise errors.OpPrereqError("Zeroing timeout options can only be used"
                                    " only with the --zero-free-space option")
 
-    self.secondary_nodes = self.instance.secondary_nodes
+    self.secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
     self.inst_disks = self.instance.disks
 
   def _CleanupExports(self, feedback_fn):
diff --git a/lib/cmdlib/base.py b/lib/cmdlib/base.py
index a1c6837..5730165 100644
--- a/lib/cmdlib/base.py
+++ b/lib/cmdlib/base.py
@@ -472,7 +472,7 @@ class LogicalUnit(object):
     for _, instance in self.cfg.GetMultiInstanceInfoByName(locked_i):
       wanted_node_uuids.append(instance.primary_node)
       if not primary_only:
-        wanted_node_uuids.extend(instance.secondary_nodes)
+        wanted_node_uuids.extend(self.cfg.GetInstanceSecondaryNodes(instance))
 
     if self.recalculate_locks[level] == constants.LOCKS_REPLACE:
       self.needed_locks[level] = wanted_node_uuids
diff --git a/lib/cmdlib/cluster.py b/lib/cmdlib/cluster.py
index d029825..e2b834b 100644
--- a/lib/cmdlib/cluster.py
+++ b/lib/cmdlib/cluster.py
@@ -1975,7 +1975,7 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
         # Important: access only the instances whose lock is owned
         instance = self.cfg.GetInstanceInfoByName(inst_name)
         if instance.disk_template in constants.DTS_INT_MIRROR:
-          nodes.update(instance.secondary_nodes)
+          nodes.update(self.cfg.GetInstanceSecondaryNodes(instance))
 
       self.needed_locks[locking.LEVEL_NODE] = nodes
 
@@ -2371,10 +2371,11 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
                   "instance %s, connection to primary node failed",
                   instance.name)
 
-    self._ErrorIf(len(instance.secondary_nodes) > 1,
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
+    self._ErrorIf(len(secondary_nodes) > 1,
                   constants.CV_EINSTANCELAYOUT, instance.name,
                   "instance has multiple secondary nodes: %s",
-                  utils.CommaJoin(instance.secondary_nodes),
+                  utils.CommaJoin(secondary_nodes),
                   code=self.ETYPE_WARNING)
 
     es_flags = rpc.GetExclusiveStorageForNodes(self.cfg, instance.all_nodes)
@@ -2420,7 +2421,7 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
                     code=self.ETYPE_WARNING)
 
     inst_nodes_offline = []
-    for snode in instance.secondary_nodes:
+    for snode in secondary_nodes:
       s_img = node_image[snode]
       self._ErrorIf(s_img.rpc_fail and not s_img.offline, 
constants.CV_ENODERPC,
                     self.cfg.GetNodeName(snode),
@@ -3343,7 +3344,7 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
       pnode = instance.primary_node
       node_image[pnode].pinst.append(instance.uuid)
 
-      for snode in instance.secondary_nodes:
+      for snode in self.cfg.GetInstanceSecondaryNodes(instance):
         nimg = node_image[snode]
         nimg.sinst.append(instance.uuid)
         if pnode not in nimg.sbp:
@@ -3560,7 +3561,7 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
     # is secondary for an instance whose primary is in another group. To avoid
     # them, we find these instances and add their volumes to node_vol_should.
     for instance in self.all_inst_info.values():
-      for secondary in instance.secondary_nodes:
+      for secondary in self.cfg.GetInstanceSecondaryNodes(instance):
         if (secondary in self.my_node_info
             and instance.name not in self.my_inst_info):
           instance.MapLVsByNode(node_vol_should)
diff --git a/lib/cmdlib/group.py b/lib/cmdlib/group.py
index 093e338..ac4d28e 100644
--- a/lib/cmdlib/group.py
+++ b/lib/cmdlib/group.py
@@ -908,8 +908,9 @@ class LUGroupVerifyDisks(NoHooksLU):
       if not inst.disks_active or inst.disk_template != constants.DT_DRBD8:
         continue
 
+      secondary_nodes = self.cfg.GetInstanceSecondaryNodes(inst)
       for node_uuid in itertools.chain([inst.primary_node],
-                                       inst.secondary_nodes):
+                                       secondary_nodes):
         node_to_inst.setdefault(node_uuid, []).append(inst)
 
     for (node_uuid, insts) in node_to_inst.items():
diff --git a/lib/cmdlib/instance.py b/lib/cmdlib/instance.py
index e5e29fd..10b1b16 100644
--- a/lib/cmdlib/instance.py
+++ b/lib/cmdlib/instance.py
@@ -1817,7 +1817,7 @@ class LUInstanceRemove(LogicalUnit):
     self.instance = self.cfg.GetInstanceInfo(self.op.instance_uuid)
     assert self.instance is not None, \
       "Cannot retrieve locked instance %s" % self.op.instance_name
-    self.secondary_nodes = self.instance.secondary_nodes
+    self.secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
     self.inst_disks = self.instance.disks
 
   def Exec(self, feedback_fn):
@@ -3201,7 +3201,8 @@ class LUInstanceSetParams(LogicalUnit):
       mem_check_list = [pnode_uuid]
       if be_new[constants.BE_AUTO_BALANCE]:
         # either we changed auto_balance to yes or it was from before
-        mem_check_list.extend(self.instance.secondary_nodes)
+        mem_check_list.extend(
+          self.cfg.GetInstanceSecondaryNodes(self.instance))
       instance_info = self.rpc.call_instance_info(
           pnode_uuid, self.instance.name, self.instance.hypervisor,
           cluster_hvparams)
@@ -3243,8 +3244,9 @@ class LUInstanceSetParams(LogicalUnit):
                                        miss_mem, errors.ECODE_NORES)
 
       if be_new[constants.BE_AUTO_BALANCE]:
+        secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
         for node_uuid, nres in nodeinfo.items():
-          if node_uuid not in self.instance.secondary_nodes:
+          if node_uuid not in secondary_nodes:
             continue
           nres.Raise("Can't get info from secondary node %s" %
                      self.cfg.GetNodeName(node_uuid), prereq=True,
@@ -3451,11 +3453,12 @@ class LUInstanceSetParams(LogicalUnit):
     """Converts an instance from drbd to plain.
 
     """
-    assert len(self.instance.secondary_nodes) == 1
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
+    assert len(secondary_nodes) == 1
     assert self.instance.disk_template == constants.DT_DRBD8
 
     pnode_uuid = self.instance.primary_node
-    snode_uuid = self.instance.secondary_nodes[0]
+    snode_uuid = secondary_nodes[0]
     feedback_fn("Converting template to plain")
 
     old_disks = AnnotateDiskParams(self.instance, self.instance.disks, 
self.cfg)
@@ -3526,10 +3529,11 @@ class LUInstanceSetParams(LogicalUnit):
     else:
       file_driver = file_path = None
 
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
     disk = \
       GenerateDiskTemplate(self, self.instance.disk_template,
                            self.instance.uuid, self.instance.primary_node,
-                           self.instance.secondary_nodes, [params], file_path,
+                           secondary_nodes, [params], file_path,
                            file_driver, idx, self.Log, self.diskparams)[0]
 
     new_disks = CreateDisks(self, self.instance, disks=[disk])
diff --git a/lib/cmdlib/instance_migration.py b/lib/cmdlib/instance_migration.py
index 7c24a57..8e5ce91 100644
--- a/lib/cmdlib/instance_migration.py
+++ b/lib/cmdlib/instance_migration.py
@@ -146,7 +146,8 @@ class LUInstanceFailover(LogicalUnit):
       }
 
     if instance.disk_template in constants.DTS_INT_MIRROR:
-      env["OLD_SECONDARY"] = self.cfg.GetNodeName(instance.secondary_nodes[0])
+      secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
+      env["OLD_SECONDARY"] = self.cfg.GetNodeName(secondary_nodes[0])
       env["NEW_SECONDARY"] = self.cfg.GetNodeName(source_node_uuid)
     else:
       env["OLD_SECONDARY"] = env["NEW_SECONDARY"] = ""
@@ -160,7 +161,8 @@ class LUInstanceFailover(LogicalUnit):
 
     """
     instance = self._migrater.instance
-    nl = [self.cfg.GetMasterNode()] + list(instance.secondary_nodes)
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
+    nl = [self.cfg.GetMasterNode()] + list(secondary_nodes)
     nl.append(self._migrater.target_node_uuid)
     return (nl, nl + [instance.primary_node])
 
@@ -211,7 +213,8 @@ class LUInstanceMigrate(LogicalUnit):
       })
 
     if instance.disk_template in constants.DTS_INT_MIRROR:
-      env["OLD_SECONDARY"] = self.cfg.GetNodeName(instance.secondary_nodes[0])
+      secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
+      env["OLD_SECONDARY"] = self.cfg.GetNodeName(secondary_nodes[0])
       env["NEW_SECONDARY"] = self.cfg.GetNodeName(source_node_uuid)
     else:
       env["OLD_SECONDARY"] = env["NEW_SECONDARY"] = ""
@@ -223,7 +226,8 @@ class LUInstanceMigrate(LogicalUnit):
 
     """
     instance = self._migrater.instance
-    snode_uuids = list(instance.secondary_nodes)
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
+    snode_uuids = list(secondary_nodes)
     nl = [self.cfg.GetMasterNode(), instance.primary_node] + snode_uuids
     nl.append(self._migrater.target_node_uuid)
     return (nl, nl)
@@ -347,7 +351,7 @@ class TLMigrateInstance(Tasklet):
         ReleaseLocks(self.lu, locking.LEVEL_NODE_ALLOC)
 
     else:
-      secondary_node_uuids = self.instance.secondary_nodes
+      secondary_node_uuids = self.cfg.GetInstanceSecondaryNodes(self.instance)
       if not secondary_node_uuids:
         raise errors.ConfigurationError("No secondary node but using"
                                         " %s disk template" %
@@ -922,7 +926,8 @@ class TLMigrateInstance(Tasklet):
 
     # FIXME: if we implement migrate-to-any in DRBD, this needs fixing
     if self.instance.disk_template in constants.DTS_INT_MIRROR:
-      self.target_node_uuid = self.instance.secondary_nodes[0]
+      secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
+      self.target_node_uuid = secondary_nodes[0]
       # Otherwise self.target_node has been populated either
       # directly, or through an iallocator.
 
diff --git a/lib/cmdlib/instance_query.py b/lib/cmdlib/instance_query.py
index 28fae88..d327042 100644
--- a/lib/cmdlib/instance_query.py
+++ b/lib/cmdlib/instance_query.py
@@ -248,8 +248,9 @@ class LUInstanceQueryData(NoHooksLU):
                                  node_uuid2name_fn),
                   instance.disks)
 
+      secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
       snodes_group_uuids = [nodes[snode_uuid].group
-                            for snode_uuid in instance.secondary_nodes]
+                            for snode_uuid in secondary_nodes]
 
       result[instance.name] = {
         "name": instance.name,
@@ -258,7 +259,7 @@ class LUInstanceQueryData(NoHooksLU):
         "pnode": pnode.name,
         "pnode_group_uuid": pnode.group,
         "pnode_group_name": group2name_fn(pnode.group),
-        "snodes": map(node_uuid2name_fn, instance.secondary_nodes),
+        "snodes": map(node_uuid2name_fn, secondary_nodes),
         "snodes_group_uuids": snodes_group_uuids,
         "snodes_group_names": map(group2name_fn, snodes_group_uuids),
         "os": instance.os,
diff --git a/lib/cmdlib/instance_storage.py b/lib/cmdlib/instance_storage.py
index ce7233e..cb7613c 100644
--- a/lib/cmdlib/instance_storage.py
+++ b/lib/cmdlib/instance_storage.py
@@ -1370,7 +1370,8 @@ def AssembleInstanceDisks(lu, instance, disks=None, 
ignore_secondaries=False,
                                              instance.name, False, idx)
       msg = result.fail_msg
       if msg:
-        is_offline_secondary = (node_uuid in instance.secondary_nodes and
+        secondary_nodes = lu.cfg.GetInstanceSecondaryNodes(instance)
+        is_offline_secondary = (node_uuid in secondary_nodes and
                                 result.offline)
         lu.LogWarning("Could not prepare block device %s on node %s"
                       " (is_primary=False, pass=1): %s",
@@ -1730,10 +1731,11 @@ class LUInstanceReplaceDisks(LogicalUnit):
 
     """
     instance = self.replacer.instance
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance)
     env = {
       "MODE": self.op.mode,
       "NEW_SECONDARY": self.op.remote_node,
-      "OLD_SECONDARY": self.cfg.GetNodeName(instance.secondary_nodes[0]),
+      "OLD_SECONDARY": self.cfg.GetNodeName(secondary_nodes[0]),
       }
     env.update(BuildInstanceHookEnvByObject(self, instance))
     return env
@@ -2020,20 +2022,21 @@ class TLReplaceDisks(Tasklet):
       raise errors.OpPrereqError("Can only run replace disks for DRBD8-based"
                                  " instances", errors.ECODE_INVAL)
 
-    if len(self.instance.secondary_nodes) != 1:
+    secondary_nodes = self.cfg.GetInstanceSeconaryNodes(self.instance)
+    if len(secondary_nodes) != 1:
       raise errors.OpPrereqError("The instance has a strange layout,"
                                  " expected one secondary but found %d" %
-                                 len(self.instance.secondary_nodes),
+                                 len(secondary_nodes),
                                  errors.ECODE_FAULT)
 
-    secondary_node_uuid = self.instance.secondary_nodes[0]
+    secondary_node_uuid = secondary_nodes[0]
 
     if self.iallocator_name is None:
       remote_node_uuid = self.remote_node_uuid
     else:
       remote_node_uuid = self._RunAllocator(self.lu, self.iallocator_name,
                                             self.instance.uuid,
-                                            self.instance.secondary_nodes)
+                                            secondary_nodes)
 
     if remote_node_uuid is None:
       self.remote_node_info = None
@@ -2188,9 +2191,9 @@ class TLReplaceDisks(Tasklet):
                 (utils.CommaJoin(self.disks), self.instance.name))
     feedback_fn("Current primary node: %s" %
                 self.cfg.GetNodeName(self.instance.primary_node))
+    secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance)
     feedback_fn("Current seconary node: %s" %
-                utils.CommaJoin(self.cfg.GetNodeNames(
-                                  self.instance.secondary_nodes)))
+                utils.CommaJoin(self.cfg.GetNodeNames(secondary_nodes)))
 
     activate_disks = not self.instance.disks_active
 
diff --git a/lib/cmdlib/instance_utils.py b/lib/cmdlib/instance_utils.py
index 628c1bb..4d73421 100644
--- a/lib/cmdlib/instance_utils.py
+++ b/lib/cmdlib/instance_utils.py
@@ -169,7 +169,7 @@ def BuildInstanceHookEnvByObject(lu, instance, 
secondary_nodes=None,
 
   # Override secondary_nodes
   if secondary_nodes is None:
-    secondary_nodes = instance.secondary_nodes
+    secondary_nodes = lu.cfg.GetInstanceSecondaryNodes(instance)
 
   # Override disks
   if disks is None:
diff --git a/lib/cmdlib/node.py b/lib/cmdlib/node.py
index 0edc007..ad2d7cb 100644
--- a/lib/cmdlib/node.py
+++ b/lib/cmdlib/node.py
@@ -858,7 +858,8 @@ def _GetNodeSecondaryInstances(cfg, node_uuid):
 
   """
   return _GetNodeInstancesInner(cfg,
-                                lambda inst: node_uuid in inst.secondary_nodes)
+                                lambda inst: node_uuid in
+                                  cfg.GetInstanceSecondaryNodes(inst))
 
 
 def _GetNodeInstances(cfg, node_uuid):
diff --git a/lib/cmdlib/test.py b/lib/cmdlib/test.py
index 2b10740..8c7df80 100644
--- a/lib/cmdlib/test.py
+++ b/lib/cmdlib/test.py
@@ -372,7 +372,8 @@ class LUTestAllocator(NoHooksLU):
       (self.inst_uuid, self.op.name) = ExpandInstanceUuidAndName(self.cfg, 
None,
                                                                  self.op.name)
       self.relocate_from_node_uuids = \
-          list(self.cfg.GetInstanceInfo(self.inst_uuid).secondary_nodes)
+          list(self.cfg.GetInstanceSecondaryNodes(
+            self.cfg.GetInstanceInfo(self.inst_uuid)))
     elif self.op.mode in (constants.IALLOCATOR_MODE_CHG_GROUP,
                           constants.IALLOCATOR_MODE_NODE_EVAC):
       if not self.op.instances:
diff --git a/lib/config.py b/lib/config.py
index d28372e..6ba05c6 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -916,7 +916,7 @@ class ConfigWriter(object):
       if instance.primary_node not in data.nodes:
         result.append("instance '%s' has invalid primary node '%s'" %
                       (instance.name, instance.primary_node))
-      for snode in instance.secondary_nodes:
+      for snode in self._UnlockedGetInstanceSecondaryNodes(instance):
         if snode not in data.nodes:
           result.append("instance '%s' has invalid secondary node '%s'" %
                         (instance.name, snode))
@@ -2196,7 +2196,7 @@ class ConfigWriter(object):
     for inst in self._ConfigData().instances.values():
       if inst.primary_node == node_uuid:
         pri.append(inst.uuid)
-      if node_uuid in inst.secondary_nodes:
+      if node_uuid in self._UnlockedGetInstanceSecondaryNodes(inst):
         sec.append(inst.uuid)
     return (pri, sec)
 
diff --git a/lib/masterd/iallocator.py b/lib/masterd/iallocator.py
index 4ceae4a..04a30a0 100644
--- a/lib/masterd/iallocator.py
+++ b/lib/masterd/iallocator.py
@@ -264,8 +264,9 @@ class IAReqRelocate(IARequestBase):
       raise errors.OpPrereqError("Can't relocate non-mirrored instances",
                                  errors.ECODE_INVAL)
 
+    secondary_nodes = cfg.GetInstanceSecondaryNodes(instance)
     if (instance.disk_template in constants.DTS_INT_MIRROR and
-        len(instance.secondary_nodes) != 1):
+        len(secondary_nodes) != 1):
       raise errors.OpPrereqError("Instance has not exactly one secondary node",
                                  errors.ECODE_STATE)
 
@@ -748,7 +749,8 @@ class IAllocator(object):
         "spindle_use": beinfo[constants.BE_SPINDLE_USE],
         "os": iinfo.os,
         "nodes": [cfg.GetNodeName(iinfo.primary_node)] +
-                 cfg.GetNodeNames(iinfo.secondary_nodes),
+                 cfg.GetNodeNames(
+                   cfg.GetInstanceSecondaryNodes(iinfo)),
         "nics": nic_data,
         "disks": [{constants.IDISK_SIZE: dsk.size,
                    constants.IDISK_MODE: dsk.mode,
diff --git a/lib/objects.py b/lib/objects.py
index 5bdb358..d6e06d7 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -1142,6 +1142,7 @@ class Instance(TaggableObject):
   __slots__ = [
     "name",
     "primary_node",
+    "secondary_nodes",
     "os",
     "hypervisor",
     "hvparams",
@@ -1157,19 +1158,6 @@ class Instance(TaggableObject):
     "serial_no",
     ] + _TIMESTAMPS + _UUID
 
-  def _ComputeSecondaryNodes(self):
-    """Compute the list of secondary nodes.
-
-    This is a simple wrapper over _ComputeAllNodes.
-
-    """
-    all_nodes = set(self._ComputeAllNodes())
-    all_nodes.discard(self.primary_node)
-    return tuple(all_nodes)
-
-  secondary_nodes = property(_ComputeSecondaryNodes, None, None,
-                             "List of names of secondary nodes")
-
   def _ComputeAllNodes(self):
     """Compute the list of all nodes.
 
diff --git a/lib/rpc/node.py b/lib/rpc/node.py
index b3b2a92..af58b61 100644
--- a/lib/rpc/node.py
+++ b/lib/rpc/node.py
@@ -877,6 +877,7 @@ class RpcRunner(_RpcClientBase,
     idict = instance.ToDict()
     cluster = self._cfg.GetClusterInfo()
     idict["hvparams"] = cluster.FillHV(instance)
+    idict["secondary_nodes"] = self._cfg.GetInstanceSecondaryNodes(instance)
     if hvp is not None:
       idict["hvparams"].update(hvp)
     idict["beparams"] = cluster.FillBE(instance)
diff --git a/test/py/ganeti.query_unittest.py b/test/py/ganeti.query_unittest.py
index 22cdc89..42cb113 100755
--- a/test/py/ganeti.query_unittest.py
+++ b/test/py/ganeti.query_unittest.py
@@ -697,6 +697,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_UP, hypervisor=constants.HT_XEN_PVM,
         os="linux1",
         primary_node="node1-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_PLAIN,
         disks=[],
         disks_active=True,
@@ -707,6 +708,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_UP, hypervisor=constants.HT_XEN_HVM,
         os="deb99",
         primary_node="node5-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DISKLESS,
         disks=[],
         disks_active=True,
@@ -721,6 +723,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_DOWN, hypervisor=constants.HT_KVM,
         os="busybox",
         primary_node="node6-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DRBD8,
         disks=[],
         disks_active=False,
@@ -738,6 +741,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_DOWN, hypervisor=constants.HT_XEN_PVM,
         os="linux1",
         primary_node="nodeoff2-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DRBD8,
         disks=[],
         disks_active=True,
@@ -764,6 +768,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_UP, hypervisor=constants.HT_XEN_HVM,
         os="deb99",
         primary_node="nodebad2-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DISKLESS,
         disks=[],
         disks_active=True,
@@ -778,6 +783,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_DOWN, hypervisor=constants.HT_XEN_HVM,
         os="deb99",
         primary_node="node7-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DISKLESS,
         disks=[],
         disks_active=False,
@@ -794,6 +800,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_DOWN, hypervisor=constants.HT_XEN_HVM,
         os="deb99",
         primary_node="node6-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DISKLESS,
         disks=[],
         disks_active=False,
@@ -805,6 +812,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_OFFLINE, hypervisor=constants.HT_XEN_HVM,
         os="deb99",
         primary_node="node6-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DISKLESS,
         disks=[],
         disks_active=False,
@@ -816,6 +824,7 @@ class TestInstanceQuery(unittest.TestCase):
         admin_state=constants.ADMINST_UP, hypervisor=constants.HT_XEN_HVM,
         os="deb99",
         primary_node="node6-uuid",
+        secondary_nodes=[],
         disk_template=constants.DT_DISKLESS,
         disks=[],
         disks_active=False,
diff --git a/test/py/ganeti.rpc_unittest.py b/test/py/ganeti.rpc_unittest.py
index 26f1069..1fc61e2 100755
--- a/test/py/ganeti.rpc_unittest.py
+++ b/test/py/ganeti.rpc_unittest.py
@@ -729,6 +729,9 @@ class _FakeConfigForRpcRunner:
   def GetInstanceDiskParams(self, _):
     return constants.DISK_DT_DEFAULTS
 
+  def GetInstanceSecondaryNodes(self, _):
+    return []
+
 
 class TestRpcRunner(unittest.TestCase):
   def testUploadFile(self):
-- 
1.9.1

Reply via email to