def submit_subinterface( self, forwarding_instance, interface, name, description=None, mac=None, vlan_ids=None, enabled_afi=[], ipv4_addresses=[], ipv6_addresses=[], iso_addresses=[], vpi=None, vci=None, enabled_protocols=[], untagged_vlan=None, tagged_vlans=[], ifindex=None, ): mac = mac or interface.mac si = self.get_subinterface(interface, name) if si: changes = self.update_if_changed( si, { "forwarding_instance": forwarding_instance, "description": description, "mac": mac, "vlan_ids": vlan_ids, "enabled_afi": enabled_afi, "ipv4_addresses": ipv4_addresses, "ipv6_addresses": ipv6_addresses, "iso_addresses": iso_addresses, "vpi": vpi, "vci": vci, "enabled_protocols": enabled_protocols, "untagged_vlan": untagged_vlan, "tagged_vlans": tagged_vlans, # ip_unnumbered_subinterface "ifindex": ifindex, }, ignore_empty=["ifindex"], ) self.log_changes("Subinterface '%s' has been changed" % name, changes) else: self.logger.info("Creating subinterface '%s'", name) si = SubInterface( forwarding_instance=forwarding_instance, interface=interface.id, managed_object=self.object.id, name=name, description=description, mac=mac, vlan_ids=vlan_ids, enabled_afi=enabled_afi, ipv4_addresses=ipv4_addresses, ipv6_addresses=ipv6_addresses, iso_addresses=iso_addresses, vpi=None, vci=None, enabled_protocols=enabled_protocols, untagged_vlan=untagged_vlan, tagged_vlans=tagged_vlans, ifindex=ifindex, ) si.save() if mac: self.interface_macs.add(mac) return si
def submit_subinterface(self, forwarding_instance, interface, name, description=None, mac=None, vlan_ids=None, enabled_afi=[], ipv4_addresses=[], ipv6_addresses=[], iso_addresses=[], vpi=None, vci=None, enabled_protocols=[], untagged_vlan=None, tagged_vlans=[], ifindex=None): mac = mac or interface.mac si = SubInterface.objects.filter(interface=interface.id, name=name).first() if si: changes = self.update_if_changed( si, { "forwarding_instance": forwarding_instance, "description": description, "mac": mac, "vlan_ids": vlan_ids, "enabled_afi": enabled_afi, "ipv4_addresses": ipv4_addresses, "ipv6_addresses": ipv6_addresses, "iso_addresses": iso_addresses, "vpi": vpi, "vci": vci, "enabled_protocols": enabled_protocols, "untagged_vlan": untagged_vlan, "tagged_vlans": tagged_vlans, # ip_unnumbered_subinterface "ifindex": ifindex }, ignore_empty=["ifindex"]) self.log_changes("Subinterface '%s' has been changed" % name, changes) else: self.info("Creating subinterface '%s'" % name) si = SubInterface(forwarding_instance=forwarding_instance, interface=interface.id, managed_object=self.object.id, name=name, description=description, mac=mac, vlan_ids=vlan_ids, enabled_afi=enabled_afi, ipv4_addresses=ipv4_addresses, ipv6_addresses=ipv6_addresses, iso_addresses=iso_addresses, vpi=None, vci=None, enabled_protocols=enabled_protocols, untagged_vlan=untagged_vlan, tagged_vlans=tagged_vlans, ifindex=ifindex) si.save() # Submit found addresses and prefixes if "IPv4" in enabled_afi or "IPv6" in enabled_afi: # Get VRF vrf = vrf_cache.get_or_create( self.object, forwarding_instance.name if forwarding_instance else "default", forwarding_instance.rd if forwarding_instance else "0:0") if vrf is None: self.info("Skipping unknown VRF '%s'" % vrf["name"]) else: # Submit ipv4 addresses and prefixes if "IPv4" in enabled_afi: for a in ipv4_addresses: self.prefix_report.submit(vrf, a, interface=si.name, description=si.description) self.ip_report.submit(vrf, a.split("/")[0], interface=si.name, mac=si.mac) # Submit ipv6 addresses and prefixes if "IPv6" in enabled_afi: for a in ipv6_addresses: self.prefix_report.submit(vrf, a, interface=si.name, description=si.description) self.ip_report.submit(vrf, a.split("/")[0], interface=si.name, mac=si.mac) # Process dual-stacking if (len(ipv4_addresses) == len(ipv6_addresses) and len(ipv4_addresses) > 0): for ipv4, ipv6 in zip(ipv4_addresses, ipv6_addresses): self.prefix_report.submit_dual_stack(vrf, ipv4, ipv6) return si