Skip to content

Commit cfd7281

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Wait for volume being available to set bootable or readonly"
2 parents a7e091c + 5c9c1c7 commit cfd7281

File tree

4 files changed

+164
-14
lines changed

4 files changed

+164
-14
lines changed

openstackclient/tests/unit/volume/v1/test_volume.py

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,8 @@ def test_volume_create_with_source(self):
430430
self.assertEqual(self.columns, columns)
431431
self.assertCountEqual(self.datalist, data)
432432

433-
def test_volume_create_with_bootable_and_readonly(self):
433+
@mock.patch.object(utils, 'wait_for_status', return_value=True)
434+
def test_volume_create_with_bootable_and_readonly(self, mock_wait):
434435
arglist = [
435436
'--bootable',
436437
'--read-only',
@@ -472,7 +473,8 @@ def test_volume_create_with_bootable_and_readonly(self):
472473
self.volumes_mock.update_readonly_flag.assert_called_with(
473474
self.new_volume.id, True)
474475

475-
def test_volume_create_with_nonbootable_and_readwrite(self):
476+
@mock.patch.object(utils, 'wait_for_status', return_value=True)
477+
def test_volume_create_with_nonbootable_and_readwrite(self, mock_wait):
476478
arglist = [
477479
'--non-bootable',
478480
'--read-write',
@@ -515,8 +517,9 @@ def test_volume_create_with_nonbootable_and_readwrite(self):
515517
self.new_volume.id, False)
516518

517519
@mock.patch.object(volume.LOG, 'error')
520+
@mock.patch.object(utils, 'wait_for_status', return_value=True)
518521
def test_volume_create_with_bootable_and_readonly_fail(
519-
self, mock_error):
522+
self, mock_wait, mock_error):
520523

521524
self.volumes_mock.set_bootable.side_effect = (
522525
exceptions.CommandError())
@@ -566,6 +569,48 @@ def test_volume_create_with_bootable_and_readonly_fail(
566569
self.volumes_mock.update_readonly_flag.assert_called_with(
567570
self.new_volume.id, True)
568571

572+
@mock.patch.object(volume.LOG, 'error')
573+
@mock.patch.object(utils, 'wait_for_status', return_value=False)
574+
def test_volume_create_non_available_with_readonly(
575+
self, mock_wait, mock_error):
576+
arglist = [
577+
'--non-bootable',
578+
'--read-only',
579+
'--size', str(self.new_volume.size),
580+
self.new_volume.display_name,
581+
]
582+
verifylist = [
583+
('bootable', False),
584+
('non_bootable', True),
585+
('read_only', True),
586+
('read_write', False),
587+
('size', self.new_volume.size),
588+
('name', self.new_volume.display_name),
589+
]
590+
591+
parsed_args = self.check_parser(
592+
self.cmd, arglist, verifylist)
593+
594+
columns, data = self.cmd.take_action(parsed_args)
595+
596+
self.volumes_mock.create.assert_called_with(
597+
self.new_volume.size,
598+
None,
599+
None,
600+
self.new_volume.display_name,
601+
None,
602+
None,
603+
None,
604+
None,
605+
None,
606+
None,
607+
None,
608+
)
609+
610+
self.assertEqual(2, mock_error.call_count)
611+
self.assertEqual(self.columns, columns)
612+
self.assertCountEqual(self.datalist, data)
613+
569614
def test_volume_create_without_size(self):
570615
arglist = [
571616
self.new_volume.display_name,

openstackclient/tests/unit/volume/v2/test_volume.py

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ def test_volume_create_with_source_volume(self):
435435
self.assertEqual(self.columns, columns)
436436
self.assertCountEqual(self.datalist, data)
437437

438-
def test_volume_create_with_bootable_and_readonly(self):
438+
@mock.patch.object(utils, 'wait_for_status', return_value=True)
439+
def test_volume_create_with_bootable_and_readonly(self, mock_wait):
439440
arglist = [
440441
'--bootable',
441442
'--read-only',
@@ -478,7 +479,8 @@ def test_volume_create_with_bootable_and_readonly(self):
478479
self.volumes_mock.update_readonly_flag.assert_called_with(
479480
self.new_volume.id, True)
480481

481-
def test_volume_create_with_nonbootable_and_readwrite(self):
482+
@mock.patch.object(utils, 'wait_for_status', return_value=True)
483+
def test_volume_create_with_nonbootable_and_readwrite(self, mock_wait):
482484
arglist = [
483485
'--non-bootable',
484486
'--read-write',
@@ -522,8 +524,9 @@ def test_volume_create_with_nonbootable_and_readwrite(self):
522524
self.new_volume.id, False)
523525

524526
@mock.patch.object(volume.LOG, 'error')
527+
@mock.patch.object(utils, 'wait_for_status', return_value=True)
525528
def test_volume_create_with_bootable_and_readonly_fail(
526-
self, mock_error):
529+
self, mock_wait, mock_error):
527530

528531
self.volumes_mock.set_bootable.side_effect = (
529532
exceptions.CommandError())
@@ -574,6 +577,50 @@ def test_volume_create_with_bootable_and_readonly_fail(
574577
self.volumes_mock.update_readonly_flag.assert_called_with(
575578
self.new_volume.id, True)
576579

580+
@mock.patch.object(volume.LOG, 'error')
581+
@mock.patch.object(utils, 'wait_for_status', return_value=False)
582+
def test_volume_create_non_available_with_readonly(
583+
self, mock_wait, mock_error,
584+
):
585+
arglist = [
586+
'--non-bootable',
587+
'--read-only',
588+
'--size', str(self.new_volume.size),
589+
self.new_volume.name,
590+
]
591+
verifylist = [
592+
('bootable', False),
593+
('non_bootable', True),
594+
('read_only', True),
595+
('read_write', False),
596+
('size', self.new_volume.size),
597+
('name', self.new_volume.name),
598+
]
599+
600+
parsed_args = self.check_parser(
601+
self.cmd, arglist, verifylist)
602+
603+
columns, data = self.cmd.take_action(parsed_args)
604+
605+
self.volumes_mock.create.assert_called_with(
606+
size=self.new_volume.size,
607+
snapshot_id=None,
608+
name=self.new_volume.name,
609+
description=None,
610+
volume_type=None,
611+
availability_zone=None,
612+
metadata=None,
613+
imageRef=None,
614+
source_volid=None,
615+
consistencygroup_id=None,
616+
scheduler_hints=None,
617+
backup_id=None,
618+
)
619+
620+
self.assertEqual(2, mock_error.call_count)
621+
self.assertEqual(self.columns, columns)
622+
self.assertCountEqual(self.datalist, data)
623+
577624
def test_volume_create_without_size(self):
578625
arglist = [
579626
self.new_volume.name,

openstackclient/volume/v1/volume.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,15 +224,44 @@ def take_action(self, parsed_args):
224224

225225
if parsed_args.bootable or parsed_args.non_bootable:
226226
try:
227-
volume_client.volumes.set_bootable(
228-
volume.id, parsed_args.bootable)
227+
if utils.wait_for_status(
228+
volume_client.volumes.get,
229+
volume.id,
230+
success_status=['available'],
231+
error_status=['error'],
232+
sleep_time=1
233+
):
234+
volume_client.volumes.set_bootable(
235+
volume.id,
236+
parsed_args.bootable
237+
)
238+
else:
239+
msg = _(
240+
"Volume status is not available for setting boot "
241+
"state"
242+
)
243+
raise exceptions.CommandError(msg)
229244
except Exception as e:
230245
LOG.error(_("Failed to set volume bootable property: %s"), e)
231246
if parsed_args.read_only or parsed_args.read_write:
232247
try:
233-
volume_client.volumes.update_readonly_flag(
248+
if utils.wait_for_status(
249+
volume_client.volumes.get,
234250
volume.id,
235-
parsed_args.read_only)
251+
success_status=['available'],
252+
error_status=['error'],
253+
sleep_time=1
254+
):
255+
volume_client.volumes.update_readonly_flag(
256+
volume.id,
257+
parsed_args.read_only
258+
)
259+
else:
260+
msg = _(
261+
"Volume status is not available for setting it"
262+
"read only."
263+
)
264+
raise exceptions.CommandError(msg)
236265
except Exception as e:
237266
LOG.error(_("Failed to set volume read-only access "
238267
"mode flag: %s"), e)

openstackclient/volume/v2/volume.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,15 +257,44 @@ def take_action(self, parsed_args):
257257

258258
if parsed_args.bootable or parsed_args.non_bootable:
259259
try:
260-
volume_client.volumes.set_bootable(
261-
volume.id, parsed_args.bootable)
260+
if utils.wait_for_status(
261+
volume_client.volumes.get,
262+
volume.id,
263+
success_status=['available'],
264+
error_status=['error'],
265+
sleep_time=1
266+
):
267+
volume_client.volumes.set_bootable(
268+
volume.id,
269+
parsed_args.bootable
270+
)
271+
else:
272+
msg = _(
273+
"Volume status is not available for setting boot "
274+
"state"
275+
)
276+
raise exceptions.CommandError(msg)
262277
except Exception as e:
263278
LOG.error(_("Failed to set volume bootable property: %s"), e)
264279
if parsed_args.read_only or parsed_args.read_write:
265280
try:
266-
volume_client.volumes.update_readonly_flag(
281+
if utils.wait_for_status(
282+
volume_client.volumes.get,
267283
volume.id,
268-
parsed_args.read_only)
284+
success_status=['available'],
285+
error_status=['error'],
286+
sleep_time=1
287+
):
288+
volume_client.volumes.update_readonly_flag(
289+
volume.id,
290+
parsed_args.read_only
291+
)
292+
else:
293+
msg = _(
294+
"Volume status is not available for setting it"
295+
"read only."
296+
)
297+
raise exceptions.CommandError(msg)
269298
except Exception as e:
270299
LOG.error(_("Failed to set volume read-only access "
271300
"mode flag: %s"), e)

0 commit comments

Comments
 (0)