4 # Copyright (C) 2010 Google Inc.
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.
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.
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
22 """Script for unittesting the RAPI rlib2 module
30 from ganeti import constants
31 from ganeti import opcodes
32 from ganeti import compat
33 from ganeti import http
35 from ganeti.rapi import rlib2
40 class TestParseInstanceCreateRequestVersion1(testutils.GanetiTestCase):
42 testutils.GanetiTestCase.setUp(self)
44 self.Parse = rlib2._ParseInstanceCreateRequestVersion1
52 [{"size": 5, }, {"size": 100, }],
55 [{"size": 123, "mode": constants.DISK_RDWR, }],
57 # With unknown setting
58 [{"size": 123, "unknown": 999 }],
70 { "ip": "1.2.3.4", "mode": constants.NIC_MODE_ROUTED, },
71 { "mode": constants.NIC_MODE_BRIDGED, "link": "n0", "bridge": "br1", },
75 [{ "unknown": 999, }, { "foobar": "Hello World", }],
81 { constants.BE_VCPUS: 2, },
82 { constants.BE_MEMORY: 123, },
83 { constants.BE_VCPUS: 2,
84 constants.BE_MEMORY: 1024,
85 constants.BE_AUTO_BALANCE: True, }
90 { constants.HV_BOOT_ORDER: "anc", },
91 { constants.HV_KERNEL_PATH: "/boot/fookernel",
92 constants.HV_ROOT_PATH: "/dev/hda1", },
95 for mode in [constants.INSTANCE_CREATE, constants.INSTANCE_IMPORT]:
96 for nics in nic_variants:
97 for disk_template in constants.DISK_TEMPLATES:
98 for disks in disk_variants:
99 for beparams in beparam_variants:
100 for hvparams in hvparam_variants:
102 "name": "inst1.example.com",
103 "hypervisor": constants.HT_FAKE,
107 "disk_template": disk_template,
110 if beparams is not None:
111 data["beparams"] = beparams
113 if hvparams is not None:
114 data["hvparams"] = hvparams
116 for dry_run in [False, True]:
117 op = self.Parse(data, dry_run)
118 self.assert_(isinstance(op, opcodes.OpCreateInstance))
119 self.assertEqual(op.mode, mode)
120 self.assertEqual(op.disk_template, disk_template)
121 self.assertEqual(op.dry_run, dry_run)
122 self.assertEqual(len(op.disks), len(disks))
123 self.assertEqual(len(op.nics), len(nics))
125 self.assert_(compat.all(opdisk.get("size") ==
127 opdisk.get("mode") ==
129 "unknown" not in opdisk
130 for opdisk, disk in zip(op.disks,
133 self.assert_(compat.all(opnic.get("size") ==
137 "unknown" not in opnic and
138 "foobar" not in opnic
139 for opnic, nic in zip(op.nics, nics)))
142 self.assertEqualValues(op.beparams, {})
144 self.assertEqualValues(op.beparams, beparams)
147 self.assertEqualValues(op.hvparams, {})
149 self.assertEqualValues(op.hvparams, hvparams)
151 def testErrors(self):
152 # Test all required fields
154 "name": "inst1.example.com",
157 "mode": constants.INSTANCE_CREATE,
158 "disk_template": constants.DT_PLAIN
161 for name in reqfields.keys():
162 self.assertRaises(http.HttpBadRequest, self.Parse,
163 dict(i for i in reqfields.iteritems() if i[0] != name),
166 # Invalid disks and nics
167 for field in ["disks", "nics"]:
168 invalid_values = [None, 1, "", {}, [1, 2, 3], ["hda1", "hda2"]]
171 invalid_values.append([
174 { "mode": constants.DISK_RDWR, },
177 for invvalue in invalid_values:
178 data = reqfields.copy()
179 data[field] = invvalue
180 self.assertRaises(http.HttpBadRequest, self.Parse, data, False)
183 class TestParseExportInstanceRequest(testutils.GanetiTestCase):
185 testutils.GanetiTestCase.setUp(self)
187 self.Parse = rlib2._ParseExportInstanceRequest
192 "mode": constants.EXPORT_MODE_REMOTE,
193 "destination": [(1, 2, 3), (99, 99, 99)],
195 "remove_instance": True,
196 "x509_key_name": ("name", "hash"),
197 "destination_x509_ca": ("x", "y", "z"),
199 op = self.Parse(name, data)
200 self.assert_(isinstance(op, opcodes.OpExportInstance))
201 self.assertEqual(op.instance_name, name)
202 self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
203 self.assertEqual(op.shutdown, True)
204 self.assertEqual(op.remove_instance, True)
205 self.assertEqualValues(op.x509_key_name, ("name", "hash"))
206 self.assertEqualValues(op.destination_x509_ca, ("x", "y", "z"))
208 def testDefaults(self):
211 "destination": "node2",
214 op = self.Parse(name, data)
215 self.assert_(isinstance(op, opcodes.OpExportInstance))
216 self.assertEqual(op.instance_name, name)
217 self.assertEqual(op.mode, constants.EXPORT_MODE_LOCAL)
218 self.assertEqual(op.remove_instance, False)
220 def testErrors(self):
221 self.assertRaises(http.HttpBadRequest, self.Parse, "err1",
222 { "remove_instance": "True", })
223 self.assertRaises(http.HttpBadRequest, self.Parse, "err1",
224 { "remove_instance": "False", })
227 if __name__ == '__main__':
228 testutils.GanetiTestProgram()