LGTM. Thanks, Jose
On Apr 16 15:19, Ilias Tsitsimpis wrote: > 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 | 3 ++- > lib/cmdlib/base.py | 3 ++- > lib/cmdlib/cluster.py | 13 +++++++------ > lib/cmdlib/group.py | 3 ++- > lib/cmdlib/instance.py | 18 ++++++++++++------ > lib/cmdlib/instance_migration.py | 18 ++++++++++++------ > 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 | 2 +- > lib/config.py | 4 ++-- > lib/masterd/iallocator.py | 6 ++++-- > lib/objects.py | 14 +------------- > lib/rpc/node.py | 2 ++ > test/py/ganeti.query_unittest.py | 9 +++++++++ > test/py/ganeti.rpc_unittest.py | 3 +++ > 17 files changed, 76 insertions(+), 51 deletions(-) > > diff --git a/lib/cmdlib/backup.py b/lib/cmdlib/backup.py > index 4787e3d..d6ac7fe 100644 > --- a/lib/cmdlib/backup.py > +++ b/lib/cmdlib/backup.py > @@ -314,7 +314,8 @@ 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.uuid) > 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..333d70c 100644 > --- a/lib/cmdlib/base.py > +++ b/lib/cmdlib/base.py > @@ -472,7 +472,8 @@ 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.uuid)) > > 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..62fedb8 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.uuid)) > > 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.uuid) > + 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.uuid): > 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.uuid): > 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..488aa6d 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.uuid) > 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..51342d6 100644 > --- a/lib/cmdlib/instance.py > +++ b/lib/cmdlib/instance.py > @@ -1817,7 +1817,8 @@ 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.uuid) > self.inst_disks = self.instance.disks > > def Exec(self, feedback_fn): > @@ -3201,7 +3202,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.uuid)) > instance_info = self.rpc.call_instance_info( > pnode_uuid, self.instance.name, self.instance.hypervisor, > cluster_hvparams) > @@ -3243,8 +3245,10 @@ class LUInstanceSetParams(LogicalUnit): > miss_mem, errors.ECODE_NORES) > > if be_new[constants.BE_AUTO_BALANCE]: > + secondary_nodes = \ > + self.cfg.GetInstanceSecondaryNodes(self.instance.uuid) > 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 +3455,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.uuid) > + 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 +3531,11 @@ class LUInstanceSetParams(LogicalUnit): > else: > file_driver = file_path = None > > + secondary_nodes = self.cfg.GetInstanceSecondaryNodes(self.instance.uuid) > 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..b1a65f8 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.uuid) > + 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.uuid) > + 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.uuid) > + 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.uuid) > + 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,8 @@ 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.uuid) > if not secondary_node_uuids: > raise errors.ConfigurationError("No secondary node but using" > " %s disk template" % > @@ -922,7 +927,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.uuid) > + 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..1bfb2e4 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.uuid) > 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..fdc6220 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.uuid) > + 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.uuid) > 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.GetInstanceSecondaryNodes(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.uuid) > 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..c12ff33 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.uuid) > > # Override disks > if disks is None: > diff --git a/lib/cmdlib/node.py b/lib/cmdlib/node.py > index 0edc007..1f69473 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.uuid)) > > > def _GetNodeInstances(cfg, node_uuid): > diff --git a/lib/cmdlib/test.py b/lib/cmdlib/test.py > index 2b10740..a2c404b 100644 > --- a/lib/cmdlib/test.py > +++ b/lib/cmdlib/test.py > @@ -372,7 +372,7 @@ 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.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 9e01cd5..93c2900 100644 > --- a/lib/config.py > +++ b/lib/config.py > @@ -920,7 +920,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.uuid): > if snode not in data.nodes: > result.append("instance '%s' has invalid secondary node '%s'" % > (instance.name, snode)) > @@ -2200,7 +2200,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.uuid): > sec.append(inst.uuid) > return (pri, sec) > > diff --git a/lib/masterd/iallocator.py b/lib/masterd/iallocator.py > index 4ceae4a..c9bc110 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.uuid) > 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.uuid)), > "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 1b3c7d2..4725b94 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..7e8425c 100644 > --- a/lib/rpc/node.py > +++ b/lib/rpc/node.py > @@ -877,6 +877,8 @@ class RpcRunner(_RpcClientBase, > idict = instance.ToDict() > cluster = self._cfg.GetClusterInfo() > idict["hvparams"] = cluster.FillHV(instance) > + idict["secondary_nodes"] = \ > + self._cfg.GetInstanceSecondaryNodes(instance.uuid) > 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 > -- Jose Antonio Lopes Ganeti Engineering Google Germany GmbH Dienerstr. 12, 80331, München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Graham Law, Christine Elizabeth Flores Steuernummer: 48/725/00206 Umsatzsteueridentifikationsnummer: DE813741370
