Revision 7796e1f8
b/lib/bootstrap.py | ||
---|---|---|
472 | 472 |
ipolicy[constants.IPOLICY_DTS] = restricted_disk_templates |
473 | 473 |
|
474 | 474 |
|
475 |
def _InitCheckDrbdHelper(drbd_helper): |
|
475 |
def _InitCheckDrbdHelper(drbd_helper, drbd_enabled):
|
|
476 | 476 |
"""Checks the DRBD usermode helper. |
477 | 477 |
|
478 | 478 |
@type drbd_helper: string |
... | ... | |
480 | 480 |
use |
481 | 481 |
|
482 | 482 |
""" |
483 |
if not drbd_enabled: |
|
484 |
return |
|
485 |
|
|
483 | 486 |
if drbd_helper is not None: |
484 | 487 |
try: |
485 | 488 |
curr_helper = drbd.DRBD8.GetUsermodeHelper() |
486 | 489 |
except errors.BlockDeviceError, err: |
487 | 490 |
raise errors.OpPrereqError("Error while checking drbd helper" |
488 |
" (specify --no-drbd-storage if you are not"
|
|
489 |
" using drbd): %s" % str(err), |
|
491 |
" (disable drbd with --enabled-disk-templates"
|
|
492 |
" if you are not using drbd): %s" % str(err),
|
|
490 | 493 |
errors.ECODE_ENVIRON) |
491 | 494 |
if drbd_helper != curr_helper: |
492 | 495 |
raise errors.OpPrereqError("Error: requiring %s as drbd helper but %s" |
... | ... | |
592 | 595 |
if vgstatus: |
593 | 596 |
raise errors.OpPrereqError("Error: %s" % vgstatus, errors.ECODE_INVAL) |
594 | 597 |
|
595 |
_InitCheckDrbdHelper(drbd_helper) |
|
598 |
drbd_enabled = constants.DT_DRBD8 in enabled_disk_templates |
|
599 |
_InitCheckDrbdHelper(drbd_helper, drbd_enabled) |
|
596 | 600 |
|
597 | 601 |
logging.debug("Stopping daemons (if any are running)") |
598 | 602 |
result = utils.RunCmd([pathutils.DAEMON_UTIL, "stop-all"]) |
b/lib/client/gnt_cluster.py | ||
---|---|---|
108 | 108 |
return vg_name |
109 | 109 |
|
110 | 110 |
|
111 |
def _InitDrbdHelper(opts): |
|
111 |
def _InitDrbdHelper(opts, enabled_disk_templates):
|
|
112 | 112 |
"""Initialize the DRBD usermode helper. |
113 | 113 |
|
114 | 114 |
""" |
115 |
if not opts.drbd_storage and opts.drbd_helper: |
|
115 |
drbd_enabled = constants.DT_DRBD8 in enabled_disk_templates |
|
116 |
|
|
117 |
# This raises an exception due to historical reasons, one might consider |
|
118 |
# letting the user set a helper without having DRBD enabled. |
|
119 |
if not drbd_enabled and opts.drbd_helper: |
|
116 | 120 |
raise errors.OpPrereqError( |
117 |
"Options --no-drbd-storage and --drbd-usermode-helper conflict.") |
|
121 |
"Enabling the DRBD disk template and setting a drbd usermode helper" |
|
122 |
" with --drbd-usermode-helper conflict.") |
|
118 | 123 |
|
119 |
if opts.drbd_storage and not opts.drbd_helper: |
|
120 |
return constants.DEFAULT_DRBD_HELPER |
|
124 |
if drbd_enabled: |
|
125 |
if opts.drbd_helper is None: |
|
126 |
return constants.DEFAULT_DRBD_HELPER |
|
127 |
if opts.drbd_helper == '': |
|
128 |
raise errors.OpPrereqError( |
|
129 |
"Unsetting the drbd usermode helper while enabling DRBD is not" |
|
130 |
" allowed.") |
|
121 | 131 |
|
122 | 132 |
return opts.drbd_helper |
123 | 133 |
|
... | ... | |
141 | 151 |
|
142 | 152 |
try: |
143 | 153 |
vg_name = _InitVgName(opts, enabled_disk_templates) |
144 |
drbd_helper = _InitDrbdHelper(opts) |
|
154 |
drbd_helper = _InitDrbdHelper(opts, enabled_disk_templates)
|
|
145 | 155 |
except errors.OpPrereqError, e: |
146 | 156 |
ToStderr(str(e)) |
147 | 157 |
return 1 |
b/test/py/ganeti.bootstrap_unittest.py | ||
---|---|---|
134 | 134 |
class TestInitCheckDrbdHelper(unittest.TestCase): |
135 | 135 |
|
136 | 136 |
@testutils.patch_object(drbd.DRBD8, "GetUsermodeHelper") |
137 |
def testNoDrbd(self, drbd_mock_get_usermode_helper): |
|
138 |
drbd_enabled = False |
|
139 |
drbd_helper = None |
|
140 |
bootstrap._InitCheckDrbdHelper(drbd_helper, drbd_enabled) |
|
141 |
|
|
142 |
@testutils.patch_object(drbd.DRBD8, "GetUsermodeHelper") |
|
137 | 143 |
def testHelperNone(self, drbd_mock_get_usermode_helper): |
144 |
drbd_enabled = True |
|
138 | 145 |
current_helper = "/bin/helper" |
139 | 146 |
drbd_helper = None |
140 | 147 |
drbd_mock_get_usermode_helper.return_value = current_helper |
141 |
bootstrap._InitCheckDrbdHelper(drbd_helper) |
|
148 |
bootstrap._InitCheckDrbdHelper(drbd_helper, drbd_enabled)
|
|
142 | 149 |
|
143 | 150 |
@testutils.patch_object(drbd.DRBD8, "GetUsermodeHelper") |
144 | 151 |
def testHelperOk(self, drbd_mock_get_usermode_helper): |
152 |
drbd_enabled = True |
|
145 | 153 |
current_helper = "/bin/helper" |
146 | 154 |
drbd_helper = "/bin/helper" |
147 | 155 |
drbd_mock_get_usermode_helper.return_value = current_helper |
148 |
bootstrap._InitCheckDrbdHelper(drbd_helper) |
|
156 |
bootstrap._InitCheckDrbdHelper(drbd_helper, drbd_enabled)
|
|
149 | 157 |
|
150 | 158 |
@testutils.patch_object(drbd.DRBD8, "GetUsermodeHelper") |
151 | 159 |
def testWrongHelper(self, drbd_mock_get_usermode_helper): |
160 |
drbd_enabled = True |
|
152 | 161 |
current_helper = "/bin/otherhelper" |
153 | 162 |
drbd_helper = "/bin/helper" |
154 | 163 |
drbd_mock_get_usermode_helper.return_value = current_helper |
155 | 164 |
self.assertRaises(errors.OpPrereqError, |
156 |
bootstrap._InitCheckDrbdHelper, drbd_helper) |
|
165 |
bootstrap._InitCheckDrbdHelper, drbd_helper, drbd_enabled)
|
|
157 | 166 |
|
158 | 167 |
@testutils.patch_object(drbd.DRBD8, "GetUsermodeHelper") |
159 | 168 |
def testHelperCheckFails(self, drbd_mock_get_usermode_helper): |
169 |
drbd_enabled = True |
|
160 | 170 |
drbd_helper = "/bin/helper" |
161 | 171 |
drbd_mock_get_usermode_helper.side_effect=errors.BlockDeviceError |
162 | 172 |
self.assertRaises(errors.OpPrereqError, |
163 |
bootstrap._InitCheckDrbdHelper, drbd_helper) |
|
173 |
bootstrap._InitCheckDrbdHelper, drbd_helper, drbd_enabled)
|
|
164 | 174 |
|
165 | 175 |
|
166 | 176 |
if __name__ == "__main__": |
b/test/py/ganeti.client.gnt_cluster_unittest.py | ||
---|---|---|
262 | 262 |
|
263 | 263 |
class InitDrbdHelper(unittest.TestCase): |
264 | 264 |
|
265 |
def setUp(self): |
|
266 |
unittest.TestCase.setUp(self) |
|
267 |
self.enabled_disk_templates = [] |
|
268 |
|
|
269 |
def enableDrbd(self): |
|
270 |
self.enabled_disk_templates = [constants.DT_DRBD8] |
|
271 |
|
|
272 |
def disableDrbd(self): |
|
273 |
self.enabled_disk_templates = [constants.DT_DISKLESS] |
|
274 |
|
|
265 | 275 |
def testNoDrbdNoHelper(self): |
266 | 276 |
opts = mock.Mock() |
267 |
opts.drbd_storage = False |
|
268 | 277 |
opts.drbd_helper = None |
269 |
helper = gnt_cluster._InitDrbdHelper(opts) |
|
278 |
self.disableDrbd() |
|
279 |
helper = gnt_cluster._InitDrbdHelper(opts, self.enabled_disk_templates) |
|
270 | 280 |
self.assertEquals(None, helper) |
271 | 281 |
|
272 | 282 |
def testNoDrbdHelper(self): |
273 | 283 |
opts = mock.Mock() |
274 |
opts.drbd_storage = None
|
|
284 |
self.disableDrbd()
|
|
275 | 285 |
opts.drbd_helper = "/bin/true" |
276 |
self.assertRaises(errors.OpPrereqError, gnt_cluster._InitDrbdHelper, opts) |
|
286 |
self.assertRaises(errors.OpPrereqError, gnt_cluster._InitDrbdHelper, opts, |
|
287 |
self.enabled_disk_templates) |
|
277 | 288 |
|
278 |
def testDrbdNoHelper(self):
|
|
289 |
def testDrbdHelperNone(self):
|
|
279 | 290 |
opts = mock.Mock() |
280 |
opts.drbd_storage = True
|
|
291 |
self.enableDrbd()
|
|
281 | 292 |
opts.drbd_helper = None |
282 |
helper = gnt_cluster._InitDrbdHelper(opts) |
|
293 |
helper = gnt_cluster._InitDrbdHelper(opts, self.enabled_disk_templates)
|
|
283 | 294 |
self.assertEquals(constants.DEFAULT_DRBD_HELPER, helper) |
284 | 295 |
|
296 |
def testDrbdHelperEmpty(self): |
|
297 |
opts = mock.Mock() |
|
298 |
self.enableDrbd() |
|
299 |
opts.drbd_helper = '' |
|
300 |
self.assertRaises(errors.OpPrereqError, gnt_cluster._InitDrbdHelper, opts, |
|
301 |
self.enabled_disk_templates) |
|
302 |
|
|
285 | 303 |
def testDrbdHelper(self): |
286 | 304 |
opts = mock.Mock() |
287 |
opts.drbd_storage = True
|
|
305 |
self.enableDrbd()
|
|
288 | 306 |
opts.drbd_helper = "/bin/true" |
289 |
helper = gnt_cluster._InitDrbdHelper(opts) |
|
307 |
helper = gnt_cluster._InitDrbdHelper(opts, self.enabled_disk_templates)
|
|
290 | 308 |
self.assertEquals(opts.drbd_helper, helper) |
291 | 309 |
|
292 | 310 |
|
Also available in: Unified diff