Statistics
| Branch: | Tag: | Revision:

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()