root / test / ganeti.rapi.rlib2_unittest.py @ b939de46
History | View | Annotate | Download (7.1 kB)
1 | 6395cebb | Michael Hanselmann | #!/usr/bin/python
|
---|---|---|---|
2 | 6395cebb | Michael Hanselmann | #
|
3 | 6395cebb | Michael Hanselmann | |
4 | 6395cebb | Michael Hanselmann | # Copyright (C) 2010 Google Inc.
|
5 | 6395cebb | Michael Hanselmann | #
|
6 | 6395cebb | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | 6395cebb | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | 6395cebb | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | 6395cebb | Michael Hanselmann | # (at your option) any later version.
|
10 | 6395cebb | Michael Hanselmann | #
|
11 | 6395cebb | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | 6395cebb | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 6395cebb | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 6395cebb | Michael Hanselmann | # General Public License for more details.
|
15 | 6395cebb | Michael Hanselmann | #
|
16 | 6395cebb | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | 6395cebb | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | 6395cebb | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | 6395cebb | Michael Hanselmann | # 02110-1301, USA.
|
20 | 6395cebb | Michael Hanselmann | |
21 | 6395cebb | Michael Hanselmann | |
22 | 6395cebb | Michael Hanselmann | """Script for unittesting the RAPI rlib2 module
|
23 | 6395cebb | Michael Hanselmann |
|
24 | 6395cebb | Michael Hanselmann | """
|
25 | 6395cebb | Michael Hanselmann | |
26 | 6395cebb | Michael Hanselmann | |
27 | 6395cebb | Michael Hanselmann | import unittest |
28 | 6395cebb | Michael Hanselmann | import tempfile |
29 | 6395cebb | Michael Hanselmann | |
30 | 6395cebb | Michael Hanselmann | from ganeti import constants |
31 | 6395cebb | Michael Hanselmann | from ganeti import opcodes |
32 | 6395cebb | Michael Hanselmann | from ganeti import compat |
33 | 6395cebb | Michael Hanselmann | from ganeti import http |
34 | 6395cebb | Michael Hanselmann | |
35 | 6395cebb | Michael Hanselmann | from ganeti.rapi import rlib2 |
36 | 6395cebb | Michael Hanselmann | |
37 | 6395cebb | Michael Hanselmann | import testutils |
38 | 6395cebb | Michael Hanselmann | |
39 | 6395cebb | Michael Hanselmann | |
40 | 6395cebb | Michael Hanselmann | class TestParseInstanceCreateRequestVersion1(testutils.GanetiTestCase): |
41 | 6395cebb | Michael Hanselmann | def setUp(self): |
42 | 6395cebb | Michael Hanselmann | testutils.GanetiTestCase.setUp(self)
|
43 | 6395cebb | Michael Hanselmann | |
44 | 6395cebb | Michael Hanselmann | self.Parse = rlib2._ParseInstanceCreateRequestVersion1
|
45 | 6395cebb | Michael Hanselmann | |
46 | 6395cebb | Michael Hanselmann | def test(self): |
47 | 6395cebb | Michael Hanselmann | disk_variants = [ |
48 | 6395cebb | Michael Hanselmann | # No disks
|
49 | 6395cebb | Michael Hanselmann | [], |
50 | 6395cebb | Michael Hanselmann | |
51 | 6395cebb | Michael Hanselmann | # Two disks
|
52 | 6395cebb | Michael Hanselmann | [{"size": 5, }, {"size": 100, }], |
53 | 6395cebb | Michael Hanselmann | |
54 | 6395cebb | Michael Hanselmann | # Disk with mode
|
55 | 6395cebb | Michael Hanselmann | [{"size": 123, "mode": constants.DISK_RDWR, }], |
56 | 6395cebb | Michael Hanselmann | |
57 | 6395cebb | Michael Hanselmann | # With unknown setting
|
58 | 6395cebb | Michael Hanselmann | [{"size": 123, "unknown": 999 }], |
59 | 6395cebb | Michael Hanselmann | ] |
60 | 6395cebb | Michael Hanselmann | |
61 | 6395cebb | Michael Hanselmann | nic_variants = [ |
62 | 6395cebb | Michael Hanselmann | # No NIC
|
63 | 6395cebb | Michael Hanselmann | [], |
64 | 6395cebb | Michael Hanselmann | |
65 | 6395cebb | Michael Hanselmann | # Three NICs
|
66 | 6395cebb | Michael Hanselmann | [{}, {}, {}], |
67 | 6395cebb | Michael Hanselmann | |
68 | 6395cebb | Michael Hanselmann | # Two NICs
|
69 | 6395cebb | Michael Hanselmann | [ |
70 | 6395cebb | Michael Hanselmann | { "ip": "1.2.3.4", "mode": constants.NIC_MODE_ROUTED, }, |
71 | 6395cebb | Michael Hanselmann | { "mode": constants.NIC_MODE_BRIDGED, "link": "n0", "bridge": "br1", }, |
72 | 6395cebb | Michael Hanselmann | ], |
73 | 6395cebb | Michael Hanselmann | |
74 | 6395cebb | Michael Hanselmann | # Unknown settings
|
75 | 6395cebb | Michael Hanselmann | [{ "unknown": 999, }, { "foobar": "Hello World", }], |
76 | 6395cebb | Michael Hanselmann | ] |
77 | 6395cebb | Michael Hanselmann | |
78 | 6395cebb | Michael Hanselmann | beparam_variants = [ |
79 | 6395cebb | Michael Hanselmann | None,
|
80 | 6395cebb | Michael Hanselmann | {}, |
81 | 6395cebb | Michael Hanselmann | { constants.BE_VCPUS: 2, },
|
82 | 6395cebb | Michael Hanselmann | { constants.BE_MEMORY: 123, },
|
83 | 6395cebb | Michael Hanselmann | { constants.BE_VCPUS: 2,
|
84 | 6395cebb | Michael Hanselmann | constants.BE_MEMORY: 1024,
|
85 | 6395cebb | Michael Hanselmann | constants.BE_AUTO_BALANCE: True, }
|
86 | 6395cebb | Michael Hanselmann | ] |
87 | 6395cebb | Michael Hanselmann | |
88 | 6395cebb | Michael Hanselmann | hvparam_variants = [ |
89 | 6395cebb | Michael Hanselmann | None,
|
90 | 6395cebb | Michael Hanselmann | { constants.HV_BOOT_ORDER: "anc", },
|
91 | 6395cebb | Michael Hanselmann | { constants.HV_KERNEL_PATH: "/boot/fookernel",
|
92 | 6395cebb | Michael Hanselmann | constants.HV_ROOT_PATH: "/dev/hda1", },
|
93 | 6395cebb | Michael Hanselmann | ] |
94 | 6395cebb | Michael Hanselmann | |
95 | 6395cebb | Michael Hanselmann | for mode in [constants.INSTANCE_CREATE, constants.INSTANCE_IMPORT]: |
96 | 6395cebb | Michael Hanselmann | for nics in nic_variants: |
97 | 6395cebb | Michael Hanselmann | for disk_template in constants.DISK_TEMPLATES: |
98 | 6395cebb | Michael Hanselmann | for disks in disk_variants: |
99 | 6395cebb | Michael Hanselmann | for beparams in beparam_variants: |
100 | 6395cebb | Michael Hanselmann | for hvparams in hvparam_variants: |
101 | 6395cebb | Michael Hanselmann | data = { |
102 | 6395cebb | Michael Hanselmann | "name": "inst1.example.com", |
103 | 6395cebb | Michael Hanselmann | "hypervisor": constants.HT_FAKE,
|
104 | 6395cebb | Michael Hanselmann | "disks": disks,
|
105 | 6395cebb | Michael Hanselmann | "nics": nics,
|
106 | 6395cebb | Michael Hanselmann | "mode": mode,
|
107 | 6395cebb | Michael Hanselmann | "disk_template": disk_template,
|
108 | 6395cebb | Michael Hanselmann | } |
109 | 6395cebb | Michael Hanselmann | |
110 | 6395cebb | Michael Hanselmann | if beparams is not None: |
111 | 6395cebb | Michael Hanselmann | data["beparams"] = beparams
|
112 | 6395cebb | Michael Hanselmann | |
113 | 6395cebb | Michael Hanselmann | if hvparams is not None: |
114 | 6395cebb | Michael Hanselmann | data["hvparams"] = hvparams
|
115 | 6395cebb | Michael Hanselmann | |
116 | 6395cebb | Michael Hanselmann | for dry_run in [False, True]: |
117 | 6395cebb | Michael Hanselmann | op = self.Parse(data, dry_run)
|
118 | 6395cebb | Michael Hanselmann | self.assert_(isinstance(op, opcodes.OpCreateInstance)) |
119 | 6395cebb | Michael Hanselmann | self.assertEqual(op.mode, mode)
|
120 | 6395cebb | Michael Hanselmann | self.assertEqual(op.disk_template, disk_template)
|
121 | 6395cebb | Michael Hanselmann | self.assertEqual(op.dry_run, dry_run)
|
122 | 6395cebb | Michael Hanselmann | self.assertEqual(len(op.disks), len(disks)) |
123 | 6395cebb | Michael Hanselmann | self.assertEqual(len(op.nics), len(nics)) |
124 | 6395cebb | Michael Hanselmann | |
125 | 6395cebb | Michael Hanselmann | self.assert_(compat.all(opdisk.get("size") == |
126 | 6395cebb | Michael Hanselmann | disk.get("size") and |
127 | 6395cebb | Michael Hanselmann | opdisk.get("mode") ==
|
128 | 6395cebb | Michael Hanselmann | disk.get("mode") and |
129 | 6395cebb | Michael Hanselmann | "unknown" not in opdisk |
130 | 6395cebb | Michael Hanselmann | for opdisk, disk in zip(op.disks, |
131 | 6395cebb | Michael Hanselmann | disks))) |
132 | 6395cebb | Michael Hanselmann | |
133 | 6395cebb | Michael Hanselmann | self.assert_(compat.all(opnic.get("size") == |
134 | 6395cebb | Michael Hanselmann | nic.get("size") and |
135 | 6395cebb | Michael Hanselmann | opnic.get("mode") ==
|
136 | 6395cebb | Michael Hanselmann | nic.get("mode") and |
137 | 6395cebb | Michael Hanselmann | "unknown" not in opnic and |
138 | 6395cebb | Michael Hanselmann | "foobar" not in opnic |
139 | 6395cebb | Michael Hanselmann | for opnic, nic in zip(op.nics, nics))) |
140 | 6395cebb | Michael Hanselmann | |
141 | 6395cebb | Michael Hanselmann | if beparams is None: |
142 | 6395cebb | Michael Hanselmann | self.assertEqualValues(op.beparams, {})
|
143 | 6395cebb | Michael Hanselmann | else:
|
144 | 6395cebb | Michael Hanselmann | self.assertEqualValues(op.beparams, beparams)
|
145 | 6395cebb | Michael Hanselmann | |
146 | 6395cebb | Michael Hanselmann | if hvparams is None: |
147 | 6395cebb | Michael Hanselmann | self.assertEqualValues(op.hvparams, {})
|
148 | 6395cebb | Michael Hanselmann | else:
|
149 | 6395cebb | Michael Hanselmann | self.assertEqualValues(op.hvparams, hvparams)
|
150 | 6395cebb | Michael Hanselmann | |
151 | 6395cebb | Michael Hanselmann | def testErrors(self): |
152 | 6395cebb | Michael Hanselmann | # Test all required fields
|
153 | 6395cebb | Michael Hanselmann | reqfields = { |
154 | 6395cebb | Michael Hanselmann | "name": "inst1.example.com", |
155 | 6395cebb | Michael Hanselmann | "disks": [],
|
156 | 6395cebb | Michael Hanselmann | "nics": [],
|
157 | 6395cebb | Michael Hanselmann | "mode": constants.INSTANCE_CREATE,
|
158 | 6395cebb | Michael Hanselmann | "disk_template": constants.DT_PLAIN
|
159 | 6395cebb | Michael Hanselmann | } |
160 | 6395cebb | Michael Hanselmann | |
161 | 6395cebb | Michael Hanselmann | for name in reqfields.keys(): |
162 | 6395cebb | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, self.Parse, |
163 | 6395cebb | Michael Hanselmann | dict(i for i in reqfields.iteritems() if i[0] != name), |
164 | 6395cebb | Michael Hanselmann | False)
|
165 | 6395cebb | Michael Hanselmann | |
166 | 6395cebb | Michael Hanselmann | # Invalid disks and nics
|
167 | 6395cebb | Michael Hanselmann | for field in ["disks", "nics"]: |
168 | 6395cebb | Michael Hanselmann | invalid_values = [None, 1, "", {}, [1, 2, 3], ["hda1", "hda2"]] |
169 | 6395cebb | Michael Hanselmann | |
170 | 6395cebb | Michael Hanselmann | if field == "disks": |
171 | 6395cebb | Michael Hanselmann | invalid_values.append([ |
172 | 6395cebb | Michael Hanselmann | # Disks without size
|
173 | 6395cebb | Michael Hanselmann | {}, |
174 | 6395cebb | Michael Hanselmann | { "mode": constants.DISK_RDWR, },
|
175 | 6395cebb | Michael Hanselmann | ]) |
176 | 6395cebb | Michael Hanselmann | |
177 | 6395cebb | Michael Hanselmann | for invvalue in invalid_values: |
178 | 6395cebb | Michael Hanselmann | data = reqfields.copy() |
179 | 6395cebb | Michael Hanselmann | data[field] = invvalue |
180 | 6395cebb | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, self.Parse, data, False) |
181 | 6395cebb | Michael Hanselmann | |
182 | 6395cebb | Michael Hanselmann | |
183 | ebeb600f | Michael Hanselmann | class TestParseExportInstanceRequest(testutils.GanetiTestCase): |
184 | ebeb600f | Michael Hanselmann | def setUp(self): |
185 | ebeb600f | Michael Hanselmann | testutils.GanetiTestCase.setUp(self)
|
186 | ebeb600f | Michael Hanselmann | |
187 | ebeb600f | Michael Hanselmann | self.Parse = rlib2._ParseExportInstanceRequest
|
188 | ebeb600f | Michael Hanselmann | |
189 | ebeb600f | Michael Hanselmann | def test(self): |
190 | ebeb600f | Michael Hanselmann | name = "instmoo"
|
191 | ebeb600f | Michael Hanselmann | data = { |
192 | ebeb600f | Michael Hanselmann | "mode": constants.EXPORT_MODE_REMOTE,
|
193 | ebeb600f | Michael Hanselmann | "destination": [(1, 2, 3), (99, 99, 99)], |
194 | ebeb600f | Michael Hanselmann | "shutdown": True, |
195 | ebeb600f | Michael Hanselmann | "remove_instance": True, |
196 | ebeb600f | Michael Hanselmann | "x509_key_name": ("name", "hash"), |
197 | ebeb600f | Michael Hanselmann | "destination_x509_ca": ("x", "y", "z"), |
198 | ebeb600f | Michael Hanselmann | } |
199 | ebeb600f | Michael Hanselmann | op = self.Parse(name, data)
|
200 | ebeb600f | Michael Hanselmann | self.assert_(isinstance(op, opcodes.OpExportInstance)) |
201 | ebeb600f | Michael Hanselmann | self.assertEqual(op.instance_name, name)
|
202 | ebeb600f | Michael Hanselmann | self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
|
203 | ebeb600f | Michael Hanselmann | self.assertEqual(op.shutdown, True) |
204 | ebeb600f | Michael Hanselmann | self.assertEqual(op.remove_instance, True) |
205 | ebeb600f | Michael Hanselmann | self.assertEqualValues(op.x509_key_name, ("name", "hash")) |
206 | ebeb600f | Michael Hanselmann | self.assertEqualValues(op.destination_x509_ca, ("x", "y", "z")) |
207 | ebeb600f | Michael Hanselmann | |
208 | ebeb600f | Michael Hanselmann | def testDefaults(self): |
209 | ebeb600f | Michael Hanselmann | name = "inst1"
|
210 | ebeb600f | Michael Hanselmann | data = { |
211 | ebeb600f | Michael Hanselmann | "destination": "node2", |
212 | ebeb600f | Michael Hanselmann | "shutdown": False, |
213 | ebeb600f | Michael Hanselmann | } |
214 | ebeb600f | Michael Hanselmann | op = self.Parse(name, data)
|
215 | ebeb600f | Michael Hanselmann | self.assert_(isinstance(op, opcodes.OpExportInstance)) |
216 | ebeb600f | Michael Hanselmann | self.assertEqual(op.instance_name, name)
|
217 | ebeb600f | Michael Hanselmann | self.assertEqual(op.mode, constants.EXPORT_MODE_LOCAL)
|
218 | ebeb600f | Michael Hanselmann | self.assertEqual(op.remove_instance, False) |
219 | ebeb600f | Michael Hanselmann | |
220 | ebeb600f | Michael Hanselmann | def testErrors(self): |
221 | ebeb600f | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, self.Parse, "err1", |
222 | ebeb600f | Michael Hanselmann | { "remove_instance": "True", }) |
223 | ebeb600f | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, self.Parse, "err1", |
224 | ebeb600f | Michael Hanselmann | { "remove_instance": "False", }) |
225 | ebeb600f | Michael Hanselmann | |
226 | ebeb600f | Michael Hanselmann | |
227 | 6395cebb | Michael Hanselmann | if __name__ == '__main__': |
228 | 6395cebb | Michael Hanselmann | testutils.GanetiTestProgram() |