Bump?
On Tue, Aug 27, 2013 at 5:05 PM, Thomas Thrainer <[email protected]>wrote: > This patch adds rudimentary unit test coverage for LUInstanceMigrate and > LUInstanceFailover. > > Signed-off-by: Thomas Thrainer <[email protected]> > --- > Makefile.am | 1 + > test/py/cmdlib/instance_migration_unittest.py | 162 > ++++++++++++++++++++++++++ > 2 files changed, 163 insertions(+) > create mode 100644 test/py/cmdlib/instance_migration_unittest.py > > diff --git a/Makefile.am b/Makefile.am > index 87d51c2..fbfce69 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -1279,6 +1279,7 @@ python_tests = \ > test/py/cmdlib/cmdlib_unittest.py \ > test/py/cmdlib/group_unittest.py \ > test/py/cmdlib/instance_unittest.py \ > + test/py/cmdlib/instance_migration_unittest.py \ > test/py/cmdlib/instance_storage_unittest.py \ > test/py/cmdlib/test_unittest.py \ > test/py/cfgupgrade_unittest.py \ > diff --git a/test/py/cmdlib/instance_migration_unittest.py > b/test/py/cmdlib/instance_migration_unittest.py > new file mode 100644 > index 0000000..0b25cc9 > --- /dev/null > +++ b/test/py/cmdlib/instance_migration_unittest.py > @@ -0,0 +1,162 @@ > +#!/usr/bin/python > +# > + > +# Copyright (C) 2013 Google Inc. > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 2 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, but > +# WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +# General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > +# 02110-1301, USA. > + > + > +"""Tests for LUInstanceFailover and LUInstanceMigrate > + > +""" > + > +from ganeti import constants > +from ganeti import objects > +from ganeti import opcodes > + > +from testsupport import * > + > +import testutils > + > + > +class TestLUInstanceMigrate(CmdlibTestCase): > + def setUp(self): > + super(TestLUInstanceMigrate, self).setUp() > + > + self.snode = self.cfg.AddNewNode() > + > + hv_info = ("bootid", > + [{ > + "type": constants.ST_LVM_VG, > + "storage_free": 10000 > + }], > + ({"memory_free": 10000}, )) > + self.rpc.call_node_info.return_value = \ > + self.RpcResultsBuilder() \ > + .AddSuccessfulNode(self.master, hv_info) \ > + .AddSuccessfulNode(self.snode, hv_info) \ > + .Build() > + > + self.rpc.call_blockdev_find.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, objects.BlockDevStatus()) > + > + self.rpc.call_migration_info.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, True) > + self.rpc.call_accept_instance.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.snode, True) > + self.rpc.call_instance_migrate.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, True) > + self.rpc.call_instance_get_migration_status.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, > objects.MigrationStatus()) > + self.rpc.call_instance_finalize_migration_dst.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.snode, True) > + self.rpc.call_instance_finalize_migration_src.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, True) > + > + self.inst = self.cfg.AddNewInstance(disk_template=constants.DT_DRBD8, > + admin_state=constants.ADMINST_UP, > + secondary_node=self.snode) > + self.op = opcodes.OpInstanceMigrate(instance_name=self.inst.name) > + > + def testPlainDisk(self): > + inst = self.cfg.AddNewInstance(disk_template=constants.DT_PLAIN) > + op = self.CopyOpCode(self.op, > + instance_name=inst.name) > + self.ExecOpCodeExpectOpPrereqError( > + op, "Instance's disk layout 'plain' does not allow migrations") > + > + def testMigrationToWrongNode(self): > + node = self.cfg.AddNewNode() > + op = self.CopyOpCode(self.op, > + target_node=node.name) > + self.ExecOpCodeExpectOpPrereqError( > + op, "Instances with disk template drbd cannot be migrated to" > + " arbitrary nodes") > + > + def testMigration(self): > + op = self.CopyOpCode(self.op) > + self.ExecOpCode(op) > + > + > +class TestLUInstanceFailover(CmdlibTestCase): > + def setUp(self): > + super(TestLUInstanceFailover, self).setUp() > + > + self.snode = self.cfg.AddNewNode() > + > + hv_info = ("bootid", > + [{ > + "type": constants.ST_LVM_VG, > + "storage_free": 10000 > + }], > + ({"memory_free": 10000}, )) > + self.rpc.call_node_info.return_value = \ > + self.RpcResultsBuilder() \ > + .AddSuccessfulNode(self.master, hv_info) \ > + .AddSuccessfulNode(self.snode, hv_info) \ > + .Build() > + > + self.rpc.call_blockdev_find.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, objects.BlockDevStatus()) > + > + self.rpc.call_instance_shutdown.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, True) > + self.rpc.call_blockdev_shutdown.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.master, True) > + self.rpc.call_blockdev_assemble.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.snode, True) > + self.rpc.call_instance_start.return_value = \ > + self.RpcResultsBuilder() \ > + .CreateSuccessfulNodeResult(self.snode, True) > + > + self.inst = self.cfg.AddNewInstance(disk_template=constants.DT_DRBD8, > + admin_state=constants.ADMINST_UP, > + secondary_node=self.snode) > + self.op = opcodes.OpInstanceFailover(instance_name=self.inst.name) > + > + def testPlainDisk(self): > + inst = self.cfg.AddNewInstance(disk_template=constants.DT_PLAIN) > + op = self.CopyOpCode(self.op, > + instance_name=inst.name) > + self.ExecOpCodeExpectOpPrereqError( > + op, "Instance's disk layout 'plain' does not allow failovers") > + > + def testMigrationToWrongNode(self): > + node = self.cfg.AddNewNode() > + op = self.CopyOpCode(self.op, > + target_node=node.name) > + self.ExecOpCodeExpectOpPrereqError( > + op, "Instances with disk template drbd cannot be failed over to" > + " arbitrary nodes") > + > + def testMigration(self): > + op = self.CopyOpCode(self.op) > + self.ExecOpCode(op) > + > + > +if __name__ == "__main__": > + testutils.GanetiTestProgram() > -- > 1.8.3.1 > > -- Thomas Thrainer | Software Engineer | [email protected] | 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
