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))