add WaitForDefaultRouteTask, use it instead of networkd-wait-online

It polls though, sorry Mathieu!
This commit is contained in:
Michael Hudson-Doyle 2016-08-30 14:08:42 +12:00
parent fe8f99fbec
commit fedcb10560
1 changed files with 32 additions and 1 deletions

View File

@ -17,6 +17,8 @@ import logging
import os
import queue
import select
import threading
import time
import netifaces
import yaml
@ -90,6 +92,34 @@ class PythonSleep(BackgroundTask):
os.write(self.w, b'x')
class WaitForDefaultRouteTask(BackgroundTask):
def __init__(self, timeout):
self.timeout = timeout
self.r, self.w = os.pipe()
def __repr__(self):
return 'WaitForDefaultRouteTask(%r)'%(self.timeout,)
def run(self, observer):
try:
start = time.time()
while time.time() - start < self.timeout:
if len(netifaces.gateways().get('default', {})) > 0:
observer.task_succeeded()
return
r, _, _ = select.select([self.r], [], [], 0.1)
if r: # we've been canceled
return
observer.task_failed()
finally:
os.close(self.r)
os.close(self.w)
def cancel(self):
os.write(self.w, b'x')
class TaskSequence:
def __init__(self, loop, tasks, watcher):
self.loop = loop
@ -191,6 +221,7 @@ class NetworkController(BaseController):
else:
self.tried_once = True
tasks = [
('timeout', WaitForDefaultRouteTask(30)),
('one', BackgroundProcess(['sleep', '1'])),
('two', BackgroundProcess(['sleep', '1'])),
('three', BackgroundProcess(['false'])),
@ -202,7 +233,7 @@ class NetworkController(BaseController):
tasks = [
('generate', BackgroundProcess(['/lib/netplan/generate'])),
('apply', BackgroundProcess(['netplan', 'apply'])),
('timeout', BackgroundProcess(['/lib/systemd/systemd-networkd-wait-online', '--timeout=30'])),
('timeout', WaitForDefaultRouteTask(30)),
]
def cancel():