Add routes to generated netplan config
ref: AETHER-1991
Change-Id: Idc1218509c816bb34dee7ffd2f2271bc2ab3b026
diff --git a/scripts/nbhelper.py b/scripts/nbhelper.py
index b941cfb..c8309ab 100644
--- a/scripts/nbhelper.py
+++ b/scripts/nbhelper.py
@@ -213,6 +213,8 @@
self.build_prefix()
self.prefixes[self.data.prefix] = self
+ self.prefixes[self.data.prefix] = self
+
@classmethod
def all_prefixes(cls):
return cls.prefixes
@@ -242,6 +244,37 @@
}
)
+ @classmethod
+ def all_reserved_by_ip(cls, ip_addr=""):
+ """
+ all_reserved_by_ip will return all reserved IP found in prefixes
+
+ We have the IP address marked as type 'Reserved' in Prefix,
+ This type of IP address is using to define a DHCP range
+ """
+
+ ret = list()
+
+ for prefix in cls.prefixes.values():
+ if ip_addr and ip_addr in prefix.aos.keys():
+ if prefix.reserved_ips:
+ return list(prefix.reserved_ips.values())
+ else:
+ if prefix.reserved_ips:
+ ret.extend(list(prefix.reserved_ips.values()))
+
+ return ret
+
+ def get_reserved_ips(self):
+ """
+ Get the reserved IP range (DHCP) in prefix
+
+ We have the IP address marked as type 'Reserved' in Prefix,
+ This type of IP address is using to define a DHCP range
+ """
+ if prefix.reserved_ips:
+ return list(prefix.reserved_ips.values())
+
def parent(self):
"""
Get the parent prefix to this prefix
@@ -558,12 +591,30 @@
interface_id=virtual_if.id
)
+ routes = []
+ for ip in virtual_if_ips:
+ reserved_ips = NBPrefix.all_reserved_by_ip(str(ip))
+ for reserved_ip in reserved_ips:
+ destination = reserved_ip["custom_fields"].get("rfc3442routes", "")
+ if destination:
+ for dest_ip in destination.split():
+ new_route = {
+ "to": dest_ip,
+ "via": str(netaddr.IPNetwork(reserved_ip["ip4"]).ip),
+ "metric": 100,
+ }
+ if new_route not in routes:
+ routes.append(new_route)
+
self.netplan_config["vlans"][virtual_if.name] = {
"id": vlan_object.vid,
"link": virtual_if.label,
"addresses": [ip.address for ip in virtual_if_ips],
}
+ if routes:
+ self.netplan_config["vlans"][virtual_if.name]["routes"] = routes
+
# If the object is mgmtserver, it needs to have DNS/NTP server configs
if self.data["device_role"]["name"] == "Router":
services = list(netboxapi.ipam.services.filter(device_id=self.id))