summaryrefslogtreecommitdiff
path: root/cloudinit/net
diff options
context:
space:
mode:
authorRyan Harper <ryan.harper@canonical.com>2016-03-23 11:05:22 -0500
committerRyan Harper <ryan.harper@canonical.com>2016-03-23 11:05:22 -0500
commit2b85dabb802766e0b3b1949d744c8860c0cb838a (patch)
treeb35a267b5e18822613af225e7af98295674e8ef7 /cloudinit/net
parent7f0871dc5b141ff4bf601b6d96021eba8a3bb0ec (diff)
downloadvyos-cloud-init-2b85dabb802766e0b3b1949d744c8860c0cb838a.tar.gz
vyos-cloud-init-2b85dabb802766e0b3b1949d744c8860c0cb838a.zip
configdata: parse and convert openstack network_data json to network_config
Diffstat (limited to 'cloudinit/net')
-rw-r--r--cloudinit/net/__init__.py34
-rw-r--r--cloudinit/net/network_state.py45
2 files changed, 70 insertions, 9 deletions
diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py
index ae7b1c04..76cd4e8b 100644
--- a/cloudinit/net/__init__.py
+++ b/cloudinit/net/__init__.py
@@ -336,7 +336,7 @@ def iface_add_attrs(iface):
'index',
'subnets',
]
- if iface['type'] not in ['bond', 'bridge']:
+ if iface['type'] not in ['bond', 'bridge', 'vlan']:
ignore_map.append('mac_address')
for key, value in iface.items():
@@ -348,19 +348,34 @@ def iface_add_attrs(iface):
return content
-def render_route(route):
- content = "up route add"
+def render_route(route, indent=""):
+ content = ""
+ up = indent + "post-up route add"
+ down = indent + "pre-down route del"
+ eol = " || true\n"
mapping = {
'network': '-net',
'netmask': 'netmask',
'gateway': 'gw',
'metric': 'metric',
}
- for k in ['network', 'netmask', 'gateway', 'metric']:
- if k in route:
- content += " %s %s" % (mapping[k], route[k])
+ if route['network'] == '0.0.0.0' and route['netmask'] == '0.0.0.0':
+ default_gw = " default gw %s" % route['gateway']
+ content += up + default_gw + eol
+ content += down + default_gw + eol
+ elif route['network'] == '::' and route['netmask'] == 0:
+ # ipv6!
+ default_gw = " -A inet6 default gw %s" % route['gateway']
+ content += up + default_gw + eol
+ content += down + default_gw + eol
+ else:
+ route_line = ""
+ for k in ['network', 'netmask', 'gateway', 'metric']:
+ if k in route:
+ route_line += " %s %s" % (mapping[k], route[k])
+ content += up + route_line + eol
+ content += down + route_line + eol
- content += '\n'
return content
@@ -384,6 +399,7 @@ def render_interfaces(network_state):
if len(value):
content += " dns-{} {}\n".format(dnskey, " ".join(value))
+ content += "\n"
for iface in sorted(interfaces.values(),
key=lambda k: (order[k['type']], k['name'])):
content += "auto {name}\n".format(**iface)
@@ -409,6 +425,8 @@ def render_interfaces(network_state):
content += iface_add_subnet(iface, subnet)
content += iface_add_attrs(iface)
+ for route in subnet.get('routes', []):
+ content += render_route(route, indent=" ")
content += "\n"
else:
content += "iface {name} {inet} {mode}\n".format(**iface)
@@ -419,7 +437,7 @@ def render_interfaces(network_state):
content += render_route(route)
# global replacements until v2 format
- content = content.replace('mac_address', 'hwaddress')
+ content = content.replace('mac_address', 'hwaddress ether')
return content
diff --git a/cloudinit/net/network_state.py b/cloudinit/net/network_state.py
index df04c526..e32d2cdf 100644
--- a/cloudinit/net/network_state.py
+++ b/cloudinit/net/network_state.py
@@ -124,6 +124,17 @@ class NetworkState:
iface = interfaces.get(command['name'], {})
for param, val in command.get('params', {}).items():
iface.update({param: val})
+
+ # convert subnet ipv6 netmask to cidr as needed
+ subnets = command.get('subnets')
+ if subnets:
+ for subnet in subnets:
+ if subnet['type'] == 'static':
+ if 'netmask' in subnet and ':' in subnet['address']:
+ subnet['netmask'] = mask2cidr(subnet['netmask'])
+ for route in subnet.get('routes', []):
+ if 'netmask' in route:
+ route['netmask'] = mask2cidr(route['netmask'])
iface.update({
'name': command.get('name'),
'type': command.get('type'),
@@ -133,7 +144,7 @@ class NetworkState:
'mtu': command.get('mtu'),
'address': None,
'gateway': None,
- 'subnets': command.get('subnets'),
+ 'subnets': subnets,
})
self.network_state['interfaces'].update({command.get('name'): iface})
self.dump_network_state()
@@ -144,6 +155,7 @@ class NetworkState:
iface eth0.222 inet static
address 10.10.10.1
netmask 255.255.255.0
+ hwaddress ether BC:76:4E:06:96:B3
vlan-raw-device eth0
'''
required_keys = [
@@ -335,6 +347,37 @@ def cidr2mask(cidr):
return ".".join([str(x) for x in mask])
+def ipv4mask2cidr(mask):
+ if '.' not in mask:
+ return mask
+ return sum([bin(int(x)).count('1') for x in mask.split('.')])
+
+
+def ipv6mask2cidr(mask):
+ if ':' not in mask:
+ return mask
+
+ bitCount = [0, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00,
+ 0xff00, 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc,
+ 0xfffe, 0xffff]
+ cidr = 0
+ for word in mask.split(':'):
+ if not word or int(word, 16) == 0:
+ break
+ cidr += bitCount.index(int(word, 16))
+
+ return cidr
+
+
+def mask2cidr(mask):
+ if ':' in mask:
+ return ipv6mask2cidr(mask)
+ elif '.' in mask:
+ return ipv4mask2cidr(mask)
+ else:
+ return mask
+
+
if __name__ == '__main__':
import sys
import random