Revision fda3d987

b/Makefile.am
1318 1318
	test/data/kvm_0.9.1_help_boot_test.txt \
1319 1319
	test/data/kvm_1.0_help.txt \
1320 1320
	test/data/kvm_1.1.2_help.txt \
1321
	test/data/kvm_runtime.json \
1321 1322
	test/data/lvs_lv.txt \
1322 1323
	test/data/NEWS_OK.txt \
1323 1324
	test/data/NEWS_previous_unreleased.txt \
b/test/data/kvm_runtime.json
1
[
2
  [
3
    "/usr/bin/kvm",
4
    "-name",
5
    "xen-test-inst2",
6
    "-m",
7
    1024,
8
    "-smp",
9
    "1",
10
    "-pidfile",
11
    "/var/run/ganeti/kvm-hypervisor/pid/xen-test-inst2",
12
    "-balloon",
13
    "virtio",
14
    "-daemonize",
15
    "-machine",
16
    "pc-1.1",
17
    "-monitor",
18
    "unix:/var/run/ganeti/kvm-hypervisor/ctrl/xen-test-inst2.monitor,server,nowait",
19
    "-serial",
20
    "unix:/var/run/ganeti/kvm-hypervisor/ctrl/xen-test-inst2.serial,server,nowait",
21
    "-usb",
22
    "-usbdevice",
23
    "tablet",
24
    "-vnc",
25
    ":5100"
26
  ],
27
  [
28
    {
29
      "mac": "aa:00:00:bf:2f:16",
30
      "nicparams": {
31
        "link": "br0",
32
        "mode": "bridged"
33
      },
34
      "pci": 6,
35
      "uuid": "003fc157-66a8-4e6d-8b7e-ec4f69751396"
36
    }
37
  ],
38
  {
39
    "acpi": true,
40
    "boot_order": "disk",
41
    "cdrom2_image_path": "",
42
    "cdrom_disk_type": "",
43
    "cdrom_image_path": "",
44
    "cpu_cores": 0,
45
    "cpu_mask": "all",
46
    "cpu_sockets": 0,
47
    "cpu_threads": 0,
48
    "cpu_type": "",
49
    "disk_cache": "default",
50
    "disk_type": "paravirtual",
51
    "floppy_image_path": "",
52
    "initrd_path": "",
53
    "kernel_args": "ro",
54
    "kernel_path": "",
55
    "keymap": "",
56
    "kvm_extra": "",
57
    "kvm_flag": "",
58
    "kvm_path": "/usr/bin/kvm",
59
    "machine_version": "",
60
    "mem_path": "",
61
    "migration_bandwidth": 32,
62
    "migration_downtime": 30,
63
    "migration_mode": "live",
64
    "migration_port": 8102,
65
    "nic_type": "paravirtual",
66
    "reboot_behavior": "reboot",
67
    "root_path": "/dev/vda1",
68
    "security_domain": "",
69
    "security_model": "none",
70
    "serial_console": true,
71
    "serial_speed": 38400,
72
    "soundhw": "",
73
    "spice_bind": "",
74
    "spice_image_compression": "",
75
    "spice_ip_version": 0,
76
    "spice_jpeg_wan_compression": "",
77
    "spice_password_file": "",
78
    "spice_playback_compression": true,
79
    "spice_streaming_video": "",
80
    "spice_tls_ciphers": "HIGH:-DES:-3DES:-EXPORT:-ADH",
81
    "spice_use_tls": false,
82
    "spice_use_vdagent": true,
83
    "spice_zlib_glz_wan_compression": "",
84
    "usb_devices": "",
85
    "usb_mouse": "",
86
    "use_chroot": false,
87
    "use_localtime": false,
88
    "vga": "",
89
    "vhost_net": false,
90
    "vnc_bind_address": "0.0.0.0",
91
    "vnc_password_file": "",
92
    "vnc_tls": false,
93
    "vnc_x509_path": "",
94
    "vnc_x509_verify": false,
95
    "vnet_hdr": true
96
  },
97
  [
98
    [
99
      {
100
        "dev_type": "lvm",
101
        "iv_name": "disk/0",
102
        "logical_id": [
103
          "autovg",
104
          "b9d4ee8e-c81b-42eb-9899-60481886c7ac.disk0"
105
        ],
106
        "mode": "rw",
107
        "name": "disk0",
108
        "params": {
109
          "stripes": 1
110
        },
111
        "pci": 4,
112
        "size": 1024,
113
        "uuid": "7c079136-2573-4112-82d0-0d3d2aa90d8f"
114
      },
115
      "/var/run/ganeti/instance-disks/xen-test-inst2:0",
116
      "rbd://123451214123/"
117
    ],
118
    [
119
      {
120
        "dev_type": "lvm",
121
        "iv_name": "disk/1",
122
        "logical_id": [
123
          "autovg",
124
          "602c0a3b-d09b-4ebe-9774-5f12ef654a1f.disk1"
125
        ],
126
        "mode": "rw",
127
        "name": "disk1",
128
        "params": {
129
          "stripes": 1
130
        },
131
        "pci": 5,
132
        "size": 512,
133
        "uuid": "9f5c5bd4-6f60-480b-acdc-9bb1a4b7df79"
134
      },
135
      "/var/run/ganeti/instance-disks/xen-test-inst2:1",
136
      null
137
    ]
138
  ]
139
]
b/test/py/cmdlib/instance_unittest.py
1970 1970
                         nics=[(constants.DDM_ADD, -1, {})])
1971 1971
    self.ExecOpCode(op)
1972 1972

  
1973
  def testHotAddNic(self):
1974
    op = self.CopyOpCode(self.op,
1975
                         nics=[(constants.DDM_ADD, -1, {})],
1976
                         hotplug=True)
1977
    self.ExecOpCode(op)
1978
    self.assertTrue(self.rpc.call_hotplug_device.called)
1979

  
1973 1980
  def testAddNicWithIp(self):
1974 1981
    op = self.CopyOpCode(self.op,
1975 1982
                         nics=[(constants.DDM_ADD, -1,
......
2053 2060
                         nics=[(constants.DDM_MODIFY, 0, {})])
2054 2061
    self.ExecOpCode(op)
2055 2062

  
2063
  def testHotModifyNic(self):
2064
    op = self.CopyOpCode(self.op,
2065
                         nics=[(constants.DDM_MODIFY, 0, {})],
2066
                         hotplug=True)
2067
    self.ExecOpCode(op)
2068
    self.assertTrue(self.rpc.call_hotplug_device.called)
2069

  
2056 2070
  def testRemoveLastNic(self):
2057 2071
    op = self.CopyOpCode(self.op,
2058 2072
                         nics=[(constants.DDM_REMOVE, 0, {})])
......
2067 2081
                         nics=[(constants.DDM_REMOVE, 0, {})])
2068 2082
    self.ExecOpCode(op)
2069 2083

  
2084
  def testHotRemoveNic(self):
2085
    inst = self.cfg.AddNewInstance(nics=[self.cfg.CreateNic(),
2086
                                         self.cfg.CreateNic()])
2087
    op = self.CopyOpCode(self.op,
2088
                         instance_name=inst.name,
2089
                         nics=[(constants.DDM_REMOVE, 0, {})],
2090
                         hotplug=True)
2091
    self.ExecOpCode(op)
2092
    self.assertTrue(self.rpc.call_hotplug_device.called)
2093

  
2070 2094
  def testSetOffline(self):
2071 2095
    op = self.CopyOpCode(self.op,
2072 2096
                         offline=True)
......
2141 2165
                                 }]])
2142 2166
    self.ExecOpCode(op)
2143 2167

  
2168
  def testHotAddDisk(self):
2169
    self.rpc.call_blockdev_assemble.return_value = \
2170
      self.RpcResultsBuilder() \
2171
        .CreateSuccessfulNodeResult(self.master, ("/dev/mocked_path",
2172
                                    "/var/run/ganeti/instance-disks/mocked_d"))
2173
    op = self.CopyOpCode(self.op,
2174
                         disks=[[constants.DDM_ADD, -1,
2175
                                 {
2176
                                   constants.IDISK_SIZE: 1024,
2177
                                 }]],
2178
                         hotplug=True)
2179
    self.ExecOpCode(op)
2180
    self.assertTrue(self.rpc.call_blockdev_create.called)
2181
    self.assertTrue(self.rpc.call_blockdev_assemble.called)
2182
    self.assertTrue(self.rpc.call_hotplug_device.called)
2183

  
2184
  def testHotRemoveDisk(self):
2185
    inst = self.cfg.AddNewInstance(disks=[self.cfg.CreateDisk(),
2186
                                          self.cfg.CreateDisk()])
2187
    op = self.CopyOpCode(self.op,
2188
                         instance_name=inst.name,
2189
                         disks=[[constants.DDM_REMOVE, -1,
2190
                                 {}]],
2191
                         hotplug=True)
2192
    self.ExecOpCode(op)
2193
    self.assertTrue(self.rpc.call_hotplug_device.called)
2194
    self.assertTrue(self.rpc.call_blockdev_shutdown.called)
2195
    self.assertTrue(self.rpc.call_blockdev_remove.called)
2196

  
2144 2197
  def testModifyDiskWithSize(self):
2145 2198
    op = self.CopyOpCode(self.op,
2146 2199
                         disks=[[constants.DDM_MODIFY, 0,
b/test/py/ganeti.hypervisor.hv_kvm_unittest.py
27 27
import socket
28 28
import os
29 29
import struct
30
import re
30 31

  
31 32
from ganeti import serializer
32 33
from ganeti import constants
......
384 385
    self.assertFalse(hv_kvm._ProbeTapVnetHdr(fd, _features_fn=lambda _: None))
385 386

  
386 387

  
388
class TestGenerateDeviceKVMId(unittest.TestCase):
389
  def test(self):
390
    device = objects.NIC()
391
    target = constants.HOTPLUG_TARGET_NIC
392
    fn = hv_kvm._GenerateDeviceKVMId
393
    self.assertRaises(errors.HotplugError, fn, target, device)
394

  
395
    device.pci = 5
396
    device.uuid = "003fc157-66a8-4e6d-8b7e-ec4f69751396"
397
    self.assertTrue(re.match("hotnic-003fc157-pci-5", fn(target, device)))
398

  
399

  
400
class TestGetRuntimeInfo(unittest.TestCase):
401
  @classmethod
402
  def _GetRuntime(cls):
403
    data = testutils.ReadTestData("kvm_runtime.json")
404
    return hv_kvm._AnalyzeSerializedRuntime(data)
405

  
406
  def _fail(self, target, device, runtime):
407
    device.uuid = "aaaaaaaa-66a8-4e6d-8b7e-ec4f69751396"
408
    self.assertRaises(errors.HotplugError,
409
                      hv_kvm._GetExistingDeviceInfo,
410
                      target, device, runtime)
411

  
412
  def testNIC(self):
413
    device = objects.NIC()
414
    target = constants.HOTPLUG_TARGET_NIC
415
    runtime = self._GetRuntime()
416

  
417
    self._fail(target, device, runtime)
418

  
419
    device.uuid = "003fc157-66a8-4e6d-8b7e-ec4f69751396"
420
    devinfo = hv_kvm._GetExistingDeviceInfo(target, device, runtime)
421
    self.assertTrue(devinfo.pci==6)
422

  
423
  def testDisk(self):
424
    device = objects.Disk()
425
    target = constants.HOTPLUG_TARGET_DISK
426
    runtime = self._GetRuntime()
427

  
428
    self._fail(target, device, runtime)
429

  
430
    device.uuid = "9f5c5bd4-6f60-480b-acdc-9bb1a4b7df79"
431
    (devinfo, _, __) = hv_kvm._GetExistingDeviceInfo(target, device, runtime)
432
    self.assertTrue(devinfo.pci==5)
433

  
434

  
387 435
if __name__ == "__main__":
388 436
  testutils.GanetiTestProgram()

Also available in: Unified diff