SHA256
1
0
forked from pool/cloud-init
cloud-init/cloud-init-write-routes.patch
Robert Schweikert 62128da3ea - Update cloud-init-write-routes.patch
+ Still need to consider the "network" configuration uption
    for the v1 config implementation. Fixes regression
    introduced with update from Wed Feb 12 19:30:42

OBS-URL: https://build.opensuse.org/package/show/Cloud:Tools/cloud-init?expand=0&rev=166
2020-03-26 17:22:08 +00:00

73 lines
3.2 KiB
Diff

--- cloudinit/distros/opensuse.py.orig
+++ cloudinit/distros/opensuse.py
@@ -11,6 +11,7 @@
from cloudinit import distros
from cloudinit.distros.parsers.hostname import HostnameConf
+from cloudinit.net.network_state import mask_to_net_prefix
from cloudinit import helpers
from cloudinit import log as logging
@@ -172,7 +173,60 @@ class Distro(distros.Distro):
util.write_file(out_fn, str(conf), 0o644)
def _write_network_config(self, netconfig):
- return self._supported_write_network_config(netconfig)
+ net_apply_res = self._supported_write_network_config(netconfig)
+ # Clobber the route files that were written in RH key-value style
+ self._write_routes(netconfig)
+ return net_apply_res
+
+ def _write_routes(self, netconfig):
+ """Write route files, not part of the standard distro interface"""
+ # Due to the implementation of the sysconfig renderer default routes
+ # are setup in ifcfg-* files. But this does not work on SLES or
+ # openSUSE https://bugs.launchpad.net/cloud-init/+bug/1812117
+ # this is a very hacky way to get around the problem until a real
+ # solution is found in the sysconfig renderer
+ device_configs = netconfig.get('config', [])
+ default_nets = ('::', '0.0.0.0')
+ for config in device_configs:
+ if_name = config.get('name')
+ subnets = config.get('subnets', [])
+ config_routes = ''
+ for subnet in subnets:
+ # Render the default gateway if it is present
+ gateway = subnet.get('gateway')
+ if gateway:
+ config_routes += ' '.join(
+ ['default', gateway, '-', '-\n']
+ )
+ # Render subnet routes
+ routes = subnet.get('routes', [])
+ for route in routes:
+ dest = route.get('destination') or route.get('network')
+ if dest in default_nets:
+ dest = 'default'
+ if dest != 'default':
+ netmask = route.get('netmask')
+ if netmask:
+ prefix = mask_to_net_prefix(netmask)
+ dest += '/' + str(prefix)
+ if '/' not in dest:
+ LOG.warning(
+ 'Route destination has no prefix "%s"', dest
+ )
+ gateway = route.get('gateway')
+ config_routes += ' '.join(
+ [dest, gateway, '-', '-\n']
+ )
+ if not config_routes:
+ dest = 'default'
+ gateway = subnet.get('gateway')
+ if gateway:
+ config_routes += ' '.join(
+ [dest, gateway, '-', '-\n']
+ )
+ if config_routes:
+ route_file = '/etc/sysconfig/network/ifroute-%s' % if_name
+ util.write_file(route_file, config_routes)
@property
def preferred_ntp_clients(self):