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
