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