Revision d1b2ffe8

b/Makefile.am
1321 1321
	test/py/cmdlib/cmdlib_unittest.py \
1322 1322
	test/py/cmdlib/group_unittest.py \
1323 1323
	test/py/cmdlib/instance_unittest.py \
1324
	test/py/cmdlib/instance_migration_unittest.py \
1324 1325
	test/py/cmdlib/instance_storage_unittest.py \
1325 1326
	test/py/cmdlib/test_unittest.py \
1326 1327
	test/py/cfgupgrade_unittest.py \
b/test/py/cmdlib/instance_migration_unittest.py
1
#!/usr/bin/python
2
#
3

  
4
# Copyright (C) 2013 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

  
21

  
22
"""Tests for LUInstanceFailover and LUInstanceMigrate
23

  
24
"""
25

  
26
from ganeti import constants
27
from ganeti import objects
28
from ganeti import opcodes
29

  
30
from testsupport import *
31

  
32
import testutils
33

  
34

  
35
class TestLUInstanceMigrate(CmdlibTestCase):
36
  def setUp(self):
37
    super(TestLUInstanceMigrate, self).setUp()
38

  
39
    self.snode = self.cfg.AddNewNode()
40

  
41
    hv_info = ("bootid",
42
               [{
43
                 "type": constants.ST_LVM_VG,
44
                 "storage_free": 10000
45
               }],
46
               ({"memory_free": 10000}, ))
47
    self.rpc.call_node_info.return_value = \
48
      self.RpcResultsBuilder() \
49
        .AddSuccessfulNode(self.master, hv_info) \
50
        .AddSuccessfulNode(self.snode, hv_info) \
51
        .Build()
52

  
53
    self.rpc.call_blockdev_find.return_value = \
54
      self.RpcResultsBuilder() \
55
        .CreateSuccessfulNodeResult(self.master, objects.BlockDevStatus())
56

  
57
    self.rpc.call_migration_info.return_value = \
58
      self.RpcResultsBuilder() \
59
        .CreateSuccessfulNodeResult(self.master, True)
60
    self.rpc.call_accept_instance.return_value = \
61
      self.RpcResultsBuilder() \
62
        .CreateSuccessfulNodeResult(self.snode, True)
63
    self.rpc.call_instance_migrate.return_value = \
64
      self.RpcResultsBuilder() \
65
        .CreateSuccessfulNodeResult(self.master, True)
66
    self.rpc.call_instance_get_migration_status.return_value = \
67
      self.RpcResultsBuilder() \
68
        .CreateSuccessfulNodeResult(self.master, objects.MigrationStatus())
69
    self.rpc.call_instance_finalize_migration_dst.return_value = \
70
      self.RpcResultsBuilder() \
71
        .CreateSuccessfulNodeResult(self.snode, True)
72
    self.rpc.call_instance_finalize_migration_src.return_value = \
73
      self.RpcResultsBuilder() \
74
        .CreateSuccessfulNodeResult(self.master, True)
75

  
76
    self.inst = self.cfg.AddNewInstance(disk_template=constants.DT_DRBD8,
77
                                        admin_state=constants.ADMINST_UP,
78
                                        secondary_node=self.snode)
79
    self.op = opcodes.OpInstanceMigrate(instance_name=self.inst.name)
80

  
81
  def testPlainDisk(self):
82
    inst = self.cfg.AddNewInstance(disk_template=constants.DT_PLAIN)
83
    op = self.CopyOpCode(self.op,
84
                         instance_name=inst.name)
85
    self.ExecOpCodeExpectOpPrereqError(
86
      op, "Instance's disk layout 'plain' does not allow migrations")
87

  
88
  def testMigrationToWrongNode(self):
89
    node = self.cfg.AddNewNode()
90
    op = self.CopyOpCode(self.op,
91
                         target_node=node.name)
92
    self.ExecOpCodeExpectOpPrereqError(
93
      op, "Instances with disk template drbd cannot be migrated to"
94
          " arbitrary nodes")
95

  
96
  def testMigration(self):
97
    op = self.CopyOpCode(self.op)
98
    self.ExecOpCode(op)
99

  
100

  
101
class TestLUInstanceFailover(CmdlibTestCase):
102
  def setUp(self):
103
    super(TestLUInstanceFailover, self).setUp()
104

  
105
    self.snode = self.cfg.AddNewNode()
106

  
107
    hv_info = ("bootid",
108
               [{
109
                 "type": constants.ST_LVM_VG,
110
                 "storage_free": 10000
111
               }],
112
               ({"memory_free": 10000}, ))
113
    self.rpc.call_node_info.return_value = \
114
      self.RpcResultsBuilder() \
115
        .AddSuccessfulNode(self.master, hv_info) \
116
        .AddSuccessfulNode(self.snode, hv_info) \
117
        .Build()
118

  
119
    self.rpc.call_blockdev_find.return_value = \
120
      self.RpcResultsBuilder() \
121
        .CreateSuccessfulNodeResult(self.master, objects.BlockDevStatus())
122

  
123
    self.rpc.call_instance_shutdown.return_value = \
124
      self.RpcResultsBuilder() \
125
        .CreateSuccessfulNodeResult(self.master, True)
126
    self.rpc.call_blockdev_shutdown.return_value = \
127
      self.RpcResultsBuilder() \
128
        .CreateSuccessfulNodeResult(self.master, True)
129
    self.rpc.call_blockdev_assemble.return_value = \
130
      self.RpcResultsBuilder() \
131
        .CreateSuccessfulNodeResult(self.snode, True)
132
    self.rpc.call_instance_start.return_value = \
133
      self.RpcResultsBuilder() \
134
        .CreateSuccessfulNodeResult(self.snode, True)
135

  
136
    self.inst = self.cfg.AddNewInstance(disk_template=constants.DT_DRBD8,
137
                                        admin_state=constants.ADMINST_UP,
138
                                        secondary_node=self.snode)
139
    self.op = opcodes.OpInstanceFailover(instance_name=self.inst.name)
140

  
141
  def testPlainDisk(self):
142
    inst = self.cfg.AddNewInstance(disk_template=constants.DT_PLAIN)
143
    op = self.CopyOpCode(self.op,
144
                         instance_name=inst.name)
145
    self.ExecOpCodeExpectOpPrereqError(
146
      op, "Instance's disk layout 'plain' does not allow failovers")
147

  
148
  def testMigrationToWrongNode(self):
149
    node = self.cfg.AddNewNode()
150
    op = self.CopyOpCode(self.op,
151
                         target_node=node.name)
152
    self.ExecOpCodeExpectOpPrereqError(
153
      op, "Instances with disk template drbd cannot be failed over to"
154
          " arbitrary nodes")
155

  
156
  def testMigration(self):
157
    op = self.CopyOpCode(self.op)
158
    self.ExecOpCode(op)
159

  
160

  
161
if __name__ == "__main__":
162
  testutils.GanetiTestProgram()

Also available in: Unified diff