mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Fix for serial when percent amount is less than one host (#15396)
Ansible when there was a percentage that was calculated to be less than 1.0 would run all hosts as the value for a rolling update. The error is due to the fact that Python will round a float that is under 1.0 to 0, which will trigger the case of 0 hosts. The 0 host case tells ansible to run all hosts. The fix will see if the percentage calculation after int conversion is 0 and will else to 1 host.
This commit is contained in:
parent
22467a0de8
commit
7bee994e1c
2 changed files with 12 additions and 1 deletions
|
@ -214,7 +214,7 @@ class PlaybookExecutor:
|
||||||
# and convert it to an integer value based on the number of hosts
|
# and convert it to an integer value based on the number of hosts
|
||||||
if isinstance(play.serial, string_types) and play.serial.endswith('%'):
|
if isinstance(play.serial, string_types) and play.serial.endswith('%'):
|
||||||
serial_pct = int(play.serial.replace("%",""))
|
serial_pct = int(play.serial.replace("%",""))
|
||||||
serial = int((serial_pct/100.0) * len(all_hosts))
|
serial = int((serial_pct/100.0) * len(all_hosts)) or 1
|
||||||
else:
|
else:
|
||||||
if play.serial is None:
|
if play.serial is None:
|
||||||
serial = -1
|
serial = -1
|
||||||
|
|
|
@ -92,3 +92,14 @@ class TestPlayIterator(unittest.TestCase):
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0','host1'],['host2','host3'],['host4','host5'],['host6','host7'],['host8','host9']])
|
self.assertEqual(pbe._get_serialized_batches(play), [['host0','host1'],['host2','host3'],['host4','host5'],['host6','host7'],['host8','host9']])
|
||||||
|
|
||||||
|
# Test when serial percent is under 1.0
|
||||||
|
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
|
play = playbook.get_plays()[0]
|
||||||
|
mock_inventory.get_hosts.return_value = ['host0','host1','host2']
|
||||||
|
self.assertEqual(pbe._get_serialized_batches(play), [['host0'],['host1'],['host2']])
|
||||||
|
|
||||||
|
# Test when there is a remainder for serial as a percent
|
||||||
|
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
|
play = playbook.get_plays()[0]
|
||||||
|
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9','host10']
|
||||||
|
self.assertEqual(pbe._get_serialized_batches(play), [['host0','host1'],['host2','host3'],['host4','host5'],['host6','host7'],['host8','host9'],['host10']])
|
||||||
|
|
Loading…
Reference in a new issue