def _build_server_config(self, fconfig):
        pr = self._physical_router
        if not pr:
            return
        pi_tag = []
        for pi in pr.physical_interfaces:
            pi_obj = PhysicalInterfaceDM.get(pi)
            if not pi_obj:
                continue
            if pi_obj.port:
                port = PortDM.get(pi_obj.port)
                pi_info = {'pi': pi, 'tag': port.tags, 'pi_obj': pi_obj}
                pi_tag.append(pi_info)

        if not pi_tag:
            return

        for pi_info in pi_tag:
            for tag in pi_info.get('tag') or []:
                tag_obj = TagDM.get(tag)
                for vn in tag_obj.virtual_networks or []:
                    vn_obj = VirtualNetworkDM.get(vn)
                    for net_ipam in vn_obj.network_ipams or []:
                        net_ipam_obj = NetworkIpamDM.get(net_ipam)
                        for server_info in \
                                net_ipam_obj.server_discovery_params:
                            dhcp_relay_server = None
                            if server_info.get('dhcp_relay_server'):
                                dhcp_relay_server = server_info.get(
                                    'dhcp_relay_server')[0]
                            vlan_tag = server_info.get('vlan_tag') or 4094
                            default_gateway = server_info.get(
                                'default_gateway') + '/' + str(
                                server_info.get('ip_prefix_len'))

                            # create irb interface
                            irb_intf, li_map = self._add_or_lookup_pi(
                                self._pi_map, 'irb', 'irb')
                            irb_intf.set_comment(self.COMMENT_STR)
                            li_name = 'irb.' + str(vlan_tag)
                            irb_intf_unit = self._add_or_lookup_li(li_map,
                                                                   li_name,
                                                                   vlan_tag)
                            self._add_ip_address(irb_intf_unit,
                                                 default_gateway)

                            # create LI
                            pi_obj = pi_info.get('pi_obj')
                            access_intf, li_map = self._add_or_lookup_pi(
                                self._pi_map, pi_obj.name, 'regular')
                            access_intf.set_comment(self.COMMENT_STR)
                            li_name = pi_obj.fq_name[-1] + '.' + str(0)
                            access_intf_unit = self._add_or_lookup_li(li_map,
                                                                      li_name,
                                                                      0)
                            access_intf_unit.add_vlans(Vlan(
                                name=tag_obj.name + "_vlan"))
                            access_intf_unit.set_family("ethernet-switching")
                            if vlan_tag == 4094:
                                access_intf_unit.set_is_tagged(False)
                            else:
                                access_intf_unit.set_is_tagged(True)

                            # create Vlan
                            vlan = Vlan(name=tag_obj.name + "_vlan")
                            vlan.set_vlan_id(vlan_tag)
                            vlan.set_comment(self.COMMENT_STR)
                            vlan.set_l3_interface('irb.' + str(vlan_tag))
                            # Add the vlan to feature config.
                            fconfig.add_vlans(vlan)

                            # set dhcp relay info
                            if dhcp_relay_server:
                                self._forwarding_options_config = \
                                    self._forwarding_options_config or \
                                    ForwardingOptions()
                                dhcp_relay = DhcpRelay()
                                dhcp_relay.set_comment(self.COMMENT_STR)
                                dhcp_relay.set_dhcp_relay_group(
                                    "SVR_RELAY_GRP_" + tag_obj.name)

                                ip_address = IpAddress(
                                    address=dhcp_relay_server)
                                dhcp_relay.add_dhcp_server_ips(ip_address)
                                self._add_ref_to_list(
                                    dhcp_relay.get_interfaces(), 'irb.' +
                                                                 str(vlan_tag))
                                self._forwarding_options_config.add_dhcp_relay(
                                    dhcp_relay)
예제 #2
0
    def build_svc_chaining_irb_bd_config(self, svc_app_obj, left_right_params):
        left_fq_name = left_right_params["left_qfx_fq_name"]
        right_fq_name = left_right_params["right_qfx_fq_name"]
        left_svc_vlan = left_right_params["left_svc_vlan"]
        right_svc_vlan = left_right_params["right_svc_vlan"]
        left_svc_unit = left_right_params["left_svc_unit"]
        right_svc_unit = left_right_params["right_svc_unit"]

        for pnf_pi, intf_type in list(svc_app_obj.physical_interfaces.items()):
            pnf_pi_obj = PhysicalInterfaceDM.get(pnf_pi)
            for spine_pi in pnf_pi_obj.physical_interfaces:
                if spine_pi not in self._physical_router.physical_interfaces:
                    continue
                spine_pi_obj = PhysicalInterfaceDM.get(spine_pi)
                if spine_pi_obj.fq_name == left_fq_name:
                    li_name = spine_pi_obj.name + "." + left_svc_vlan
                    li_fq_name = spine_pi_obj.fq_name + [
                        li_name.replace(":", "_")
                    ]
                    li_obj = LogicalInterfaceDM.find_by_fq_name(li_fq_name)
                    if li_obj:
                        # irb creation
                        iip_obj = InstanceIpDM.get(li_obj.instance_ip)
                        if iip_obj:
                            irb_addr = iip_obj.instance_ip_address
                            irb_unit = left_svc_unit
                            left_irb_intf, li_map = self._add_or_lookup_pi(
                                self.pi_map_leafspine, "irb", "irb")
                            intf_unit = self._add_or_lookup_li(
                                li_map, "irb." + str(irb_unit), irb_unit)
                            intf_unit.set_comment("PNF-Service-Chaining")
                            self._add_ip_address(intf_unit, irb_addr + "/29")
                            # build BD config
                            left_bd_vlan = Vlan(
                                name=DMUtils.make_bridge_name(left_svc_unit),
                                vxlan_id=left_svc_unit,
                            )
                            left_bd_vlan.set_vlan_id(left_svc_vlan)
                            left_bd_vlan.set_description(
                                "PNF-Service-Chaining")
                            left_bd_vlan.set_comment("PNF-Service-Chaining")
                            self._add_ref_to_list(
                                left_bd_vlan.get_interfaces(),
                                "irb." + str(irb_unit),
                            )
                            self.vlan_map[
                                left_bd_vlan.get_name()] = left_bd_vlan
                            # create logical interfaces for the aggregated
                            # interfaces
                            left_svc_intf, li_map = self._add_or_lookup_pi(
                                self.pi_map_leafspine,
                                spine_pi_obj.name,
                                "service",
                            )
                            left_svc_intf_unit = self._add_or_lookup_li(
                                li_map, left_fq_name[-1] + ".0", "0")
                            left_svc_intf_unit.set_comment(
                                "PNF-Service-Chaining")
                            left_svc_intf_unit.set_family("ethernet-switching")
                            vlan_left = Vlan(name="bd-" + left_svc_unit)
                            if (vlan_left.get_name()
                                    not in self.svc_intf_vlans["vlan_names"]):
                                left_svc_intf_unit.add_vlans(vlan_left)
                                self.svc_intf_vlans["vlan_names"].append(
                                    vlan_left.get_name())

                if spine_pi_obj.fq_name == right_fq_name:
                    li_name = spine_pi_obj.name + "." + right_svc_vlan
                    li_fq_name = spine_pi_obj.fq_name + [
                        li_name.replace(":", "_")
                    ]
                    li_obj = LogicalInterfaceDM.find_by_fq_name(li_fq_name)
                    if li_obj:
                        # irb creation
                        iip_obj = InstanceIpDM.get(li_obj.instance_ip)
                        if iip_obj:
                            irb_addr = iip_obj.instance_ip_address
                            irb_unit = right_svc_unit
                            right_irb_intf, li_map = self._add_or_lookup_pi(
                                self.pi_map_leafspine, "irb", "irb")
                            intf_unit = self._add_or_lookup_li(
                                li_map, "irb." + str(irb_unit), irb_unit)
                            intf_unit.set_comment("PNF-Service-Chaining")
                            self._add_ip_address(intf_unit, irb_addr + "/29")
                            # build BD config
                            right_bd_vlan = Vlan(
                                name=DMUtils.make_bridge_name(right_svc_unit),
                                vxlan_id=right_svc_unit,
                            )
                            right_bd_vlan.set_vlan_id(right_svc_vlan)
                            right_bd_vlan.set_description(
                                "PNF-Service-Chaining")
                            right_bd_vlan.set_comment("PNF-Service-Chaining")
                            self._add_ref_to_list(
                                right_bd_vlan.get_interfaces(),
                                "irb." + str(irb_unit),
                            )
                            self.vlan_map[
                                right_bd_vlan.get_name()] = right_bd_vlan
                            # create logical interfaces for the aggregated
                            # interfaces
                            right_svc_intf, li_map = self._add_or_lookup_pi(
                                self.pi_map_leafspine,
                                spine_pi_obj.name,
                                "service",
                            )
                            right_svc_intf_unit = self._add_or_lookup_li(
                                li_map, right_fq_name[-1] + ".0", "0")
                            right_svc_intf_unit.set_comment(
                                "PNF-Service-Chaining")
                            right_svc_intf_unit.set_family(
                                "ethernet-switching")
                            vlan_right = Vlan(name="bd-" + right_svc_unit)
                            if (vlan_right.get_name()
                                    not in self.svc_intf_vlans["vlan_names"]):
                                right_svc_intf_unit.add_vlans(vlan_right)
                                self.svc_intf_vlans["vlan_names"].append(
                                    vlan_right.get_name())