- interface = kwargs.get('interface', None)
- gateway = kwargs.get('gateway', None)
-
- try:
- net_addr = IPv6Address(unicode(network))
- af_inet = AF_INET6
- is_ipv6 = 1
- except (AddressValueError, NetmaskValueError):
- net_addr = IPv4Address(unicode(network))
- af_inet = AF_INET
- is_ipv6 = 0
-
- if gateway:
- try:
- gt_addr = IPv6Address(unicode(gateway))
- af_inet_gt = AF_INET6
- except (AddressValueError, NetmaskValueError):
- gt_addr = IPv4Address(unicode(gateway))
- af_inet_gt = AF_INET
-
- cmd = 'ip_add_del_route'
- args = dict(
- next_hop_sw_if_index=InterfaceUtil.get_interface_index(
- node, interface) if interface else Constants.BITWISE_NON_ZERO,
+ interface = kwargs.get('interface', '')
+ gateway = kwargs.get('gateway', '')
+
+ net_addr = ip_address(unicode(network))
+
+ def union_addr(ip_addr):
+ """Creates union IP address.
+
+ :param ip_addr: IPv4 or IPv6 address.
+ :type ip_addr: IPv4Address or IPv6Address
+ :returns: Union IP address.
+ :rtype: dict
+ """
+ return dict(ip6=inet_pton(AF_INET6, str(ip_addr))) \
+ if ip_addr.version == 6 \
+ else dict(ip4=inet_pton(AF_INET, str(ip_addr)))
+
+ addr = dict(
+ af=getattr(
+ AddressFamily, 'ADDRESS_IP6' if net_addr.version == 6
+ else 'ADDRESS_IP4').value)
+ prefix = dict(address_length=int(prefix_len))
+
+ paths = list()
+ n_hop = dict(
+ address=union_addr(ip_address(unicode(gateway))) if gateway else 0,
+ via_label=MPLS_LABEL_INVALID,
+ obj_id=Constants.BITWISE_NON_ZERO)
+ path = dict(
+ sw_if_index=InterfaceUtil.get_interface_index(node, interface)
+ if interface else Constants.BITWISE_NON_ZERO,
+ table_id=int(kwargs.get('lookup_vrf', 0)),
+ rpf_id=Constants.BITWISE_NON_ZERO,
+ weight=int(kwargs.get('weight', 1)),
+ preference=1,
+ type=getattr(
+ FibPathType, 'FIB_PATH_TYPE_LOCAL'
+ if kwargs.get('local', False)
+ else 'FIB_PATH_TYPE_NORMAL').value,
+ flags=getattr(FibPathFlags, 'FIB_PATH_FLAG_NONE').value,
+ proto=getattr(
+ FibPathNhProto, 'FIB_PATH_NH_PROTO_IP6'
+ if net_addr.version == 6
+ else 'FIB_PATH_NH_PROTO_IP4').value,
+ nh=n_hop,
+ n_labels=0,
+ label_stack=list(0 for _ in range(16)))
+ paths.append(path)
+
+ route = dict(