Skip to content

Commit c73f728

Browse files
author
Erwan BERNARD
authored
Merge pull request #31 from scality/bugfix/RELENG-4763/verify-vm-spawn-correclty
[RELENG-4763] verify VM spawn correctly
2 parents 85fb66c + 9e38d97 commit c73f728

File tree

4 files changed

+31
-8
lines changed

4 files changed

+31
-8
lines changed

runners_manager/runner/Runner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
class Runner(object):
1010
name: str
1111
started_at: datetime.datetime or None
12+
created_at: datetime.datetime
1213
status: str
1314
status_history: list[str]
1415

@@ -21,6 +22,7 @@ def __init__(self, name: str, vm_id: str or None, vm_type: VmType):
2122
self.vm_id = vm_id
2223
self.vm_type = vm_type
2324

25+
self.created_at = datetime.datetime.now()
2426
self.status = 'offline'
2527
self.status_history = []
2628
self.action_id = None

runners_manager/runner/RunnerManager.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,19 @@ def update(self, github_runners: list[dict]):
6565
while self.need_new_runner(vm_type):
6666
self.create_runner(vm_type)
6767

68+
# Respawn runner if they are offline for more then 15min after spawn
69+
# TODO add this timer in the config file
70+
for runner in self.filter_runners(vm_type, lambda r: r.status == 'offline'):
71+
time_since_spawn = datetime.datetime.now() - runner.created_at
72+
if runner.has_run is False \
73+
and time_since_spawn > datetime.timedelta(minutes=15):
74+
self.respawn_replace(runner)
75+
6876
# Delete if you have too many and they are not used for the last x hours / minutes
69-
for elem in self.filter_runners(vm_type, lambda r: r.status == 'online'):
70-
if elem.time_online > datetime.timedelta(**self.extra_runner_online_timer) \
77+
for runner in self.filter_runners(vm_type, lambda r: r.status == 'online'):
78+
if runner.time_online > datetime.timedelta(**self.extra_runner_online_timer) \
7179
and self.too_much_runner(vm_type):
72-
self.delete_runner(elem)
80+
self.delete_runner(runner)
7381

7482
def too_much_runner(self, vm_type: VmType):
7583
current_online = len(
@@ -136,6 +144,7 @@ def respawn_replace(self, runner: Runner):
136144
)
137145
runner.status_history = []
138146
runner.vm_id = vm.id
147+
runner.created_at = datetime.datetime.now()
139148

140149
def delete_runner(self, runner: Runner):
141150
logger.info(f"Deleting {runner.name}: type {runner.vm_type}")

runners_manager/runner/tests/tests_runner.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from unittest.mock import patch, Mock, MagicMock
33

44
from runners_manager.runner.RunnerManager import RunnerManager
5-
from runners_manager.runner.Runner import Runner
65
from runners_manager.runner.VmType import VmType
76

87

@@ -95,9 +94,14 @@ def test_config_vm_type(self, name_generator: Mock,
9594
self.assertEqual(r.runner_management.__len__(), 1)
9695

9796
self.assertEqual(r.runners.__len__(), 2)
98-
self.assertEqual(r.runners['0'], Runner('0', '1', r.runner_management[0]))
99-
self.assertEqual(r.runners['1'].__dict__,
100-
Runner('1', '2', r.runner_management[0]).__dict__)
97+
self.assertEqual(r.runners['0'].name, '0')
98+
self.assertEqual(r.runners['0'].vm_id, '1')
99+
self.assertEqual(r.runners['0'].vm_type, r.runner_management[0])
100+
101+
self.assertEqual(r.runners['1'].name, '1')
102+
self.assertEqual(r.runners['1'].vm_id, '2')
103+
self.assertEqual(r.runners['1'].vm_type, r.runner_management[0])
104+
101105
self.assertEqual(r.runner_counter, 2)
102106
self.github_manager.create_runner_token.assert_called()
103107
self.openstack_manager.create_vm.assert_called()

runners_manager/vm_creation/openstack.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import time
23

34
import keystoneauth1.session
45
import keystoneclient.auth.identity.v3
@@ -74,9 +75,16 @@ def create_vm(self, runner: Runner, runner_token: int or None,
7475
userdata=self.script_init_runner(runner, runner_token, github_organization,
7576
installer)
7677
)
78+
while instance.status not in ['ACTIVE', 'ERROR']:
79+
instance = self.nova_client.servers.get(instance.id)
80+
time.sleep(2)
81+
if instance.status == 'ERROR':
82+
logger.info('vm failed, creating a new one')
83+
self.delete_vm(instance.id)
84+
return self.create_vm(runner, runner_token, github_organization, installer)
7785

7886
logger.info("vm is successfully created")
7987
return instance
8088

81-
def delete_vm(self, id):
89+
def delete_vm(self, id: str):
8290
self.nova_client.servers.delete(id)

0 commit comments

Comments
 (0)