Revision c7a02959

b/Makefile.am
1303 1303
	test/data/cluster_config_2.7.json \
1304 1304
	test/data/cluster_config_2.8.json \
1305 1305
	test/data/cluster_config_2.9.json \
1306
	test/data/cluster_config_2.10.json \
1306 1307
	test/data/instance-minor-pairing.txt \
1307 1308
	test/data/instance-prim-sec.txt \
1308 1309
	test/data/ip-addr-show-dummy0.txt \
b/NEWS
2 2
====
3 3

  
4 4

  
5
Version 2.11.0 alpha1
6
---------------------
7

  
8
*(unreleased)*
9

  
10

  
5 11
Version 2.10.0 alpha1
6 12
---------------------
7 13

  
b/README
1
Ganeti 2.10
1
Ganeti 2.11
2 2
===========
3 3

  
4 4
For installation instructions, read the INSTALL and the doc/install.rst
b/configure.ac
1 1
# Configure script for Ganeti
2 2
m4_define([gnt_version_major], [2])
3
m4_define([gnt_version_minor], [10])
3
m4_define([gnt_version_minor], [11])
4 4
m4_define([gnt_version_revision], [0])
5 5
m4_define([gnt_version_suffix], [~alpha1])
6 6
m4_define([gnt_version_full],
b/doc/hooks.rst
1 1
Ganeti customisation using hooks
2 2
================================
3 3

  
4
Documents Ganeti version 2.10
4
Documents Ganeti version 2.11
5 5

  
6 6
.. contents::
7 7

  
b/doc/iallocator.rst
1 1
Ganeti automatic instance allocation
2 2
====================================
3 3

  
4
Documents Ganeti version 2.10
4
Documents Ganeti version 2.11
5 5

  
6 6
.. contents::
7 7

  
b/doc/security.rst
1 1
Security in Ganeti
2 2
==================
3 3

  
4
Documents Ganeti version 2.10
4
Documents Ganeti version 2.11
5 5

  
6 6
Ganeti was developed to run on internal, trusted systems. As such, the
7 7
security model is all-or-nothing.
b/doc/virtual-cluster.rst
1 1
Virtual cluster support
2 2
=======================
3 3

  
4
Documents Ganeti version 2.10
4
Documents Ganeti version 2.11
5 5

  
6 6
.. contents::
7 7

  
b/test/data/cluster_config_2.10.json
1
{
2
    "cluster": {
3
        "beparams": {
4
            "default": {
5
                "always_failover": false,
6
                "auto_balance": true,
7
                "maxmem": 128,
8
                "minmem": 128,
9
                "spindle_use": 1,
10
                "vcpus": 1
11
            }
12
        },
13
        "blacklisted_os": [],
14
        "candidate_pool_size": 10,
15
        "cluster_name": "cluster.name.example.com",
16
        "ctime": 1343869045.604884,
17
        "default_iallocator": "hail",
18
        "disk_state_static": {},
19
        "diskparams": {
20
            "blockdev": {},
21
            "diskless": {},
22
            "drbd": {
23
                "c-delay-target": 1,
24
                "c-fill-target": 200,
25
                "c-max-rate": 2048,
26
                "c-min-rate": 1024,
27
                "c-plan-ahead": 1,
28
                "data-stripes": 2,
29
                "disk-barriers": "bf",
30
                "disk-custom": "",
31
                "dynamic-resync": false,
32
                "meta-barriers": true,
33
                "meta-stripes": 2,
34
                "metavg": "xenvg",
35
                "net-custom": "",
36
                "resync-rate": 1024
37
            },
38
            "ext": {},
39
            "file": {},
40
            "plain": {
41
                "stripes": 2
42
            },
43
            "rbd": {
44
                "pool": "rbd"
45
            },
46
            "sharedfile": {}
47
        },
48
        "drbd_usermode_helper": "/bin/true",
49
        "enabled_disk_templates": [
50
            "drbd",
51
            "plain",
52
            "file",
53
            "sharedfile"
54
        ],
55
        "enabled_hypervisors": [
56
            "xen-pvm"
57
        ],
58
        "file_storage_dir": "",
59
        "hidden_os": [],
60
        "highest_used_port": 32105,
61
        "hv_state_static": {
62
            "xen-pvm": {
63
                "cpu_node": 1,
64
                "cpu_total": 1,
65
                "mem_hv": 0,
66
                "mem_node": 0,
67
                "mem_total": 0
68
            }
69
        },
70
        "hvparams": {
71
            "chroot": {
72
                "init_script": "/ganeti-chroot"
73
            },
74
            "fake": {},
75
            "kvm": {
76
                "acpi": true,
77
                "boot_order": "disk",
78
                "cdrom2_image_path": "",
79
                "cdrom_disk_type": "",
80
                "cdrom_image_path": "",
81
                "cpu_cores": 0,
82
                "cpu_mask": "all",
83
                "cpu_sockets": 0,
84
                "cpu_threads": 0,
85
                "cpu_type": "",
86
                "disk_cache": "default",
87
                "disk_type": "paravirtual",
88
                "floppy_image_path": "",
89
                "initrd_path": "",
90
                "kernel_args": "ro",
91
                "kernel_path": "/boot/vmlinuz-kvmU",
92
                "keymap": "",
93
                "kvm_extra": "",
94
                "kvm_flag": "",
95
                "kvm_path": "/usr/bin/kvm",
96
                "machine_version": "",
97
                "mem_path": "",
98
                "migration_bandwidth": 4,
99
                "migration_downtime": 30,
100
                "migration_mode": "live",
101
                "migration_port": 4041,
102
                "nic_type": "paravirtual",
103
                "reboot_behavior": "reboot",
104
                "root_path": "/dev/vda1",
105
                "security_domain": "",
106
                "security_model": "none",
107
                "serial_console": true,
108
                "serial_speed": 38400,
109
                "soundhw": "",
110
                "spice_bind": "",
111
                "spice_image_compression": "",
112
                "spice_ip_version": 0,
113
                "spice_jpeg_wan_compression": "",
114
                "spice_password_file": "",
115
                "spice_playback_compression": true,
116
                "spice_streaming_video": "",
117
                "spice_tls_ciphers": "HIGH:-DES:-3DES:-EXPORT:-ADH",
118
                "spice_use_tls": false,
119
                "spice_use_vdagent": true,
120
                "spice_zlib_glz_wan_compression": "",
121
                "usb_devices": "",
122
                "usb_mouse": "",
123
                "use_chroot": false,
124
                "use_localtime": false,
125
                "vga": "",
126
                "vhost_net": false,
127
                "vnc_bind_address": "",
128
                "vnc_password_file": "",
129
                "vnc_tls": false,
130
                "vnc_x509_path": "",
131
                "vnc_x509_verify": false
132
            },
133
            "lxc": {
134
                "cpu_mask": ""
135
            },
136
            "xen-hvm": {
137
                "acpi": true,
138
                "blockdev_prefix": "hd",
139
                "boot_order": "cd",
140
                "cdrom_image_path": "",
141
                "cpu_cap": 0,
142
                "cpu_mask": "all",
143
                "cpu_weight": 256,
144
                "device_model": "/usr/lib/xen/bin/qemu-dm",
145
                "disk_type": "paravirtual",
146
                "kernel_path": "/usr/lib/xen/boot/hvmloader",
147
                "migration_mode": "non-live",
148
                "migration_port": 8082,
149
                "nic_type": "rtl8139",
150
                "pae": true,
151
                "pci_pass": "",
152
                "reboot_behavior": "reboot",
153
                "use_localtime": false,
154
                "vif_script": "",
155
                "vnc_bind_address": "0.0.0.0",
156
                "vnc_password_file": "/your/vnc-cluster-password",
157
                "xen_cmd": "xm"
158
            },
159
            "xen-pvm": {
160
                "blockdev_prefix": "sd",
161
                "bootloader_args": "",
162
                "bootloader_path": "",
163
                "cpu_cap": 0,
164
                "cpu_mask": "all",
165
                "cpu_weight": 256,
166
                "initrd_path": "",
167
                "kernel_args": "ro",
168
                "kernel_path": "/boot/vmlinuz-xenU",
169
                "migration_mode": "live",
170
                "migration_port": 8082,
171
                "reboot_behavior": "reboot",
172
                "root_path": "/dev/xvda1",
173
                "use_bootloader": false,
174
                "vif_script": "",
175
                "xen_cmd": "xm"
176
            }
177
        },
178
        "ipolicy": {
179
            "disk-templates": [
180
                "sharedfile",
181
                "diskless",
182
                "plain",
183
                "blockdev",
184
                "drbd",
185
                "file",
186
                "rbd"
187
            ],
188
            "minmax": [
189
                {
190
                    "max": {
191
                        "cpu-count": 8,
192
                        "disk-count": 16,
193
                        "disk-size": 1048576,
194
                        "memory-size": 32768,
195
                        "nic-count": 8,
196
                        "spindle-use": 12
197
                    },
198
                    "min": {
199
                        "cpu-count": 1,
200
                        "disk-count": 1,
201
                        "disk-size": 1024,
202
                        "memory-size": 128,
203
                        "nic-count": 1,
204
                        "spindle-use": 1
205
                    }
206
                }
207
            ],
208
            "spindle-ratio": 32.0,
209
            "std": {
210
                "cpu-count": 1,
211
                "disk-count": 1,
212
                "disk-size": 1024,
213
                "memory-size": 128,
214
                "nic-count": 1,
215
                "spindle-use": 1
216
            },
217
            "vcpu-ratio": 1.0
218
        },
219
        "mac_prefix": "aa:bb:cc",
220
        "maintain_node_health": false,
221
        "master_ip": "192.0.2.87",
222
        "master_netdev": "eth0",
223
        "master_netmask": 32,
224
        "master_node": "9a12d554-75c0-4cb1-8064-103365145db0",
225
        "modify_etc_hosts": true,
226
        "modify_ssh_setup": true,
227
        "mtime": 1361964122.79471,
228
        "ndparams": {
229
            "exclusive_storage": false,
230
            "oob_program": "",
231
            "spindle_count": 1
232
        },
233
        "nicparams": {
234
            "default": {
235
                "link": "br974",
236
                "mode": "bridged"
237
            }
238
        },
239
        "os_hvp": {
240
            "TEMP-Ganeti-QA-OS": {
241
                "xen-hvm": {
242
                    "acpi": false,
243
                    "pae": true
244
                },
245
                "xen-pvm": {
246
                    "root_path": "/dev/sda5"
247
                }
248
            }
249
        },
250
        "osparams": {},
251
        "prealloc_wipe_disks": false,
252
        "primary_ip_family": 2,
253
        "reserved_lvs": [],
254
        "rsahostkeypub": "YOURKEY",
255
        "serial_no": 3189,
256
        "shared_file_storage_dir": "/srv/ganeti/shared-file-storage",
257
        "tags": [
258
            "mytag"
259
        ],
260
        "tcpudp_port_pool": [
261
            32101,
262
            32102,
263
            32103,
264
            32104,
265
            32105
266
        ],
267
        "uid_pool": [],
268
        "use_external_mip_script": false,
269
        "uuid": "dddf8c12-f2d8-4718-a35b-7804daf12a3f",
270
        "volume_group_name": "xenvg"
271
    },
272
    "ctime": 1343869045.605523,
273
    "instances": {
274
        "4e091bdc-e205-4ed7-8a47-0c9130a6619f": {
275
            "admin_state": "up",
276
            "beparams": {},
277
            "ctime": 1354038435.343601,
278
            "disk_template": "plain",
279
            "disks": [
280
                {
281
                    "dev_type": "plain",
282
                    "iv_name": "disk/0",
283
                    "logical_id": [
284
                        "xenvg",
285
                        "b27a576a-13f7-4f07-885c-63fcad4fdfcc.disk0"
286
                    ],
287
                    "mode": "rw",
288
                    "params": {},
289
                    "size": 1280,
290
                    "uuid": "150bd154-8e23-44d1-b762-5065ae5a507b"
291
                }
292
            ],
293
            "hvparams": {},
294
            "hypervisor": "xen-pvm",
295
            "mtime": 1354224585.700732,
296
            "name": "instance3.example.com",
297
            "nics": [
298
                {
299
                    "mac": "aa:bb:cc:5e:5c:75",
300
                    "nicparams": {},
301
                    "uuid": "1ab090c1-e017-406c-afb4-fc285cb43e31"
302
                }
303
            ],
304
            "os": "debian-image",
305
            "osparams": {},
306
            "primary_node": "2ae3d962-2dad-44f2-bdb1-85f77107f907",
307
            "serial_no": 4,
308
            "tags": [],
309
            "uuid": "4e091bdc-e205-4ed7-8a47-0c9130a6619f"
310
        },
311
        "6c078d22-3eb6-4780-857d-81772e09eef1": {
312
            "admin_state": "up",
313
            "beparams": {},
314
            "ctime": 1363620258.608976,
315
            "disk_template": "drbd",
316
            "disks": [
317
                {
318
                    "children": [
319
                        {
320
                            "dev_type": "plain",
321
                            "logical_id": [
322
                                "xenvg",
323
                                "5c390722-6a7a-4bb4-9cef-98d896a8e6b1.disk0_data"
324
                            ],
325
                            "params": {},
326
                            "size": 1024
327
                        },
328
                        {
329
                            "dev_type": "plain",
330
                            "logical_id": [
331
                                "xenvg",
332
                                "5c390722-6a7a-4bb4-9cef-98d896a8e6b1.disk0_meta"
333
                            ],
334
                            "params": {},
335
                            "size": 128
336
                        }
337
                    ],
338
                    "dev_type": "drbd",
339
                    "iv_name": "disk/0",
340
                    "logical_id": [
341
                        "9a12d554-75c0-4cb1-8064-103365145db0",
342
                        "41f9c238-173c-4120-9e41-04ad379b647a",
343
                        32100,
344
                        0,
345
                        0,
346
                        "d3c3fd475fcbaf5fd177fb245ac43b71247ada38"
347
                    ],
348
                    "mode": "rw",
349
                    "params": {},
350
                    "size": 1024,
351
                    "uuid": "77ced3a5-6756-49ae-8d1f-274e27664c05"
352
                }
353
            ],
354
            "hvparams": {},
355
            "hypervisor": "xen-pvm",
356
            "mtime": 1363620320.874901,
357
            "name": "instance1.example.com",
358
            "nics": [
359
                {
360
                    "mac": "aa:bb:cc:b2:6e:0b",
361
                    "nicparams": {},
362
                    "uuid": "2c953d72-fac4-4aa9-a225-4131bb271791"
363
                }
364
            ],
365
            "os": "busybox",
366
            "osparams": {},
367
            "primary_node": "9a12d554-75c0-4cb1-8064-103365145db0",
368
            "serial_no": 2,
369
            "uuid": "6c078d22-3eb6-4780-857d-81772e09eef1"
370
        },
371
        "8fde9f6d-e1f1-4850-9e9c-154966f622f5": {
372
            "admin_state": "up",
373
            "beparams": {},
374
            "ctime": 1355186880.451181,
375
            "disk_template": "plain",
376
            "disks": [
377
                {
378
                    "dev_type": "plain",
379
                    "iv_name": "disk/0",
380
                    "logical_id": [
381
                        "xenvg",
382
                        "3e559cd7-1024-4294-a923-a9fd13182b2f.disk0"
383
                    ],
384
                    "mode": "rw",
385
                    "params": {},
386
                    "size": 102400,
387
                    "uuid": "79acf611-be58-4334-9fe4-4f2b73ae8abb"
388
                }
389
            ],
390
            "hvparams": {},
391
            "hypervisor": "xen-pvm",
392
            "mtime": 1355186898.307642,
393
            "name": "instance2.example.com",
394
            "nics": [
395
                {
396
                    "mac": "aa:bb:cc:56:83:fb",
397
                    "nicparams": {},
398
                    "uuid": "1cf95562-e676-4fd0-8214-e8b84a2f7bd1"
399
                }
400
            ],
401
            "os": "debian-image",
402
            "osparams": {},
403
            "primary_node": "41f9c238-173c-4120-9e41-04ad379b647a",
404
            "serial_no": 2,
405
            "tags": [],
406
            "uuid": "8fde9f6d-e1f1-4850-9e9c-154966f622f5"
407
        }
408
    },
409
    "mtime": 1367352404.758083,
410
    "networks": {
411
        "99f0128a-1c84-44da-90b9-9581ea00c075": {
412
            "ext_reservations": "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
413
            "name": "a network",
414
            "network": "203.0.113.0/24",
415
            "reservations": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
416
            "serial_no": 1,
417
            "uuid": "99f0128a-1c84-44da-90b9-9581ea00c075"
418
        }
419
    },
420
    "nodegroups": {
421
        "5244a46d-7506-4e14-922d-02b58153dde1": {
422
            "alloc_policy": "preferred",
423
            "diskparams": {},
424
            "ipolicy": {},
425
            "mtime": 1361963775.575009,
426
            "name": "default",
427
            "ndparams": {},
428
            "networks": {},
429
            "serial_no": 125,
430
            "tags": [],
431
            "uuid": "5244a46d-7506-4e14-922d-02b58153dde1"
432
        },
433
        "6c0a8916-b719-45ad-95dd-82192b1e473f": {
434
            "alloc_policy": "preferred",
435
            "diskparams": {},
436
            "ipolicy": {
437
                "disk-templates": [
438
                    "plain"
439
                ],
440
                "minmax": [
441
                    {
442
                        "max": {
443
                            "cpu-count": 8,
444
                            "disk-count": 16,
445
                            "disk-size": 1048576,
446
                            "memory-size": 32768,
447
                            "nic-count": 18,
448
                            "spindle-use": 14
449
                        },
450
                        "min": {
451
                            "cpu-count": 2,
452
                            "disk-count": 2,
453
                            "disk-size": 1024,
454
                            "memory-size": 128,
455
                            "nic-count": 1,
456
                            "spindle-use": 1
457
                        }
458
                    }
459
                ],
460
                "spindle-ratio": 5.2,
461
                "vcpu-ratio": 3.14
462
            },
463
            "mtime": 1361963775.575009,
464
            "name": "another",
465
            "ndparams": {
466
                "exclusive_storage": true
467
            },
468
            "networks": {},
469
            "serial_no": 125,
470
            "tags": [],
471
            "uuid": "6c0a8916-b719-45ad-95dd-82192b1e473f"
472
        }
473
    },
474
    "nodes": {
475
        "2ae3d962-2dad-44f2-bdb1-85f77107f907": {
476
            "ctime": 1343869045.604884,
477
            "drained": false,
478
            "group": "5244a46d-7506-4e14-922d-02b58153dde1",
479
            "master_candidate": true,
480
            "master_capable": true,
481
            "mtime": 1358348755.779906,
482
            "name": "node2.example.com",
483
            "ndparams": {},
484
            "offline": false,
485
            "powered": true,
486
            "primary_ip": "192.0.2.83",
487
            "secondary_ip": "198.51.100.83",
488
            "serial_no": 6,
489
            "tags": [],
490
            "uuid": "2ae3d962-2dad-44f2-bdb1-85f77107f907",
491
            "vm_capable": true
492
        },
493
        "41f9c238-173c-4120-9e41-04ad379b647a": {
494
            "ctime": 1343869205.934807,
495
            "drained": false,
496
            "group": "5244a46d-7506-4e14-922d-02b58153dde1",
497
            "master_candidate": true,
498
            "master_capable": true,
499
            "mtime": 1353019704.885368,
500
            "name": "node3.example.com",
501
            "ndparams": {},
502
            "offline": false,
503
            "powered": true,
504
            "primary_ip": "192.0.2.84",
505
            "secondary_ip": "198.51.100.84",
506
            "serial_no": 2,
507
            "tags": [],
508
            "uuid": "41f9c238-173c-4120-9e41-04ad379b647a",
509
            "vm_capable": true
510
        },
511
        "9a12d554-75c0-4cb1-8064-103365145db0": {
512
            "ctime": 1349722460.022264,
513
            "drained": false,
514
            "group": "5244a46d-7506-4e14-922d-02b58153dde1",
515
            "master_candidate": true,
516
            "master_capable": true,
517
            "mtime": 1359986533.353329,
518
            "name": "node1.example.com",
519
            "ndparams": {},
520
            "offline": false,
521
            "powered": true,
522
            "primary_ip": "192.0.2.82",
523
            "secondary_ip": "198.51.100.82",
524
            "serial_no": 197,
525
            "tags": [],
526
            "uuid": "9a12d554-75c0-4cb1-8064-103365145db0",
527
            "vm_capable": true
528
        }
529
    },
530
    "serial_no": 7625,
531
    "version": 2100000
532
}
533

  
b/test/py/cfgupgrade_unittest.py
371 371
  def testUpgradeFullConfigFrom_2_8(self):
372 372
    self._TestUpgradeFromFile("cluster_config_2.8.json", False)
373 373

  
374
  def testUpgradeFullConfigFrom_2_9(self):
375
    self._TestUpgradeFromFile("cluster_config_2.9.json", False)
376

  
374 377
  def testUpgradeCurrent(self):
375 378
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
376 379

  
......
388 391
  def testDowngradeFullConfig(self):
389 392
    """Test for upgrade + downgrade combination."""
390 393
    # This test can work only with the previous version of a configuration!
391
    oldconfname = "cluster_config_2.9.json"
394
    oldconfname = "cluster_config_2.10.json"
392 395
    self._TestUpgradeFromFile(oldconfname, False)
393 396
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
394 397
    oldconf = self._LoadTestDataConfig(oldconfname)
395 398
    newconf = self._LoadConfig()
396 399

  
397
    # downgrade from 2.10 to 2.9 does not add physical_id to disks, which is ok
398
    # TODO (2.11): Remove this code, it's not required to downgrade from 2.11
399
    #              to 2.10
400
    def RemovePhysicalId(disk):
401
      if "children" in disk:
402
        for d in disk["children"]:
403
          RemovePhysicalId(d)
404
      if "physical_id" in disk:
405
        del disk["physical_id"]
406

  
407
    for inst in oldconf["instances"].values():
408
      for disk in inst["disks"]:
409
        RemovePhysicalId(disk)
410

  
411 400
    self.assertEqual(oldconf, newconf)
412 401

  
413 402
  def testDowngradeFullConfigBackwardFrom_2_7(self):
b/tools/cfgupgrade
54 54
#: Target major version we will upgrade to
55 55
TARGET_MAJOR = 2
56 56
#: Target minor version we will upgrade to
57
TARGET_MINOR = 10
57
TARGET_MINOR = 11
58 58
#: Target major version for downgrade
59 59
DOWNGRADE_MAJOR = 2
60 60
#: Target minor version for downgrade
61
DOWNGRADE_MINOR = 9
61
DOWNGRADE_MINOR = 10
62 62

  
63 63
# map of legacy device types
64 64
# (mapping differing old LD_* constants to new DT_* constants)
......
394 394
  UpgradeInstanceIndices(config_data)
395 395

  
396 396

  
397
def DowngradeInstances(config_data):
398
  if "instances" not in config_data:
399
    raise Error("Cannot find the 'instances' key in the configuration!")
400
  for (iname, iobj) in config_data["instances"].items():
401
    DowngradeNicParamsVLAN(iobj["nics"], iname)
402

  
403

  
404
def DowngradeNicParamsVLAN(nics, owner):
405
  for nic in nics:
406
    vlan = nic["nicparams"].get("vlan", None)
407
    if vlan:
408
      logging.warning("Instance with name %s found. Removing VLAN information"
409
                      " %s.", owner, vlan)
410
      del nic["nicparams"]["vlan"]
411

  
412

  
413 397
def DowngradeAll(config_data):
414 398
  # Any code specific to a particular version should be labeled that way, so
415 399
  # it can be removed when updating to the next version.
416 400
  config_data["version"] = version.BuildVersion(DOWNGRADE_MAJOR,
417 401
                                                DOWNGRADE_MINOR, 0)
418
  DowngradeInstances(config_data)
419 402

  
420 403

  
421 404
def main():
......
536 519
                   config_minor, config_revision))
537 520
    DowngradeAll(config_data)
538 521

  
539
  # Upgrade from 2.{0..9} to 2.10
540
  elif config_major == 2 and config_minor in range(0, 10):
522
  # Upgrade from 2.{0..10} to 2.11
523
  elif config_major == 2 and config_minor in range(0, 11):
541 524
    if config_revision != 0:
542 525
      logging.warning("Config revision is %s, not 0", config_revision)
543 526
    UpgradeAll(config_data)

Also available in: Unified diff