Beispiel #1
0
    def setup(self, daemon, overlay):
        '''
        Set up overlay link runtime state.
        '''

        super().setup(daemon, overlay)

        self.outer_overlay_name = overlay.name
        self.outer_asn = overlay.asn

        self.inner_overlay = self.daemon.overlays[self.inner_overlay_name]
        self.inner_netns = netns.get(self.dry_run, self.logger, self.inner_overlay_name)
        self.inner_asn = self.inner_overlay.asn

        self.dummy_name = self.daemon.interface_name(self.name, limit=13)
        self.bridge_name = self.daemon.interface_name(self.dummy_name, suffix="br")
        self.outer_name = self.daemon.interface_name(self.dummy_name, suffix="v")
        self.inner_name = self.daemon.interface_name(self.dummy_name, suffix="v")
Beispiel #2
0
    def setup(self, daemon):
        '''
        Set up the overlay runtime state.
        '''

        if not self.enabled:
            return

        self.set_settingup()

        # Set arguments.
        self.daemon = daemon

        # Configure fields which use the daemon object.
        self.dry_run = self.daemon.dry_run

        if self.fwbuilder_script_file:
            if os.path.isabs(self.fwbuilder_script_file):
                self.fwbuilder_script = self.fwbuilder_script_file
            else:
                self.fwbuilder_script = os.path.join(
                    self.daemon.fwbuilder_script_dir,
                    self.fwbuilder_script_file,
                )
        else:
            self.fwbuilder_script = None

        self.root_dir = os.path.join(self.daemon.overlay_dir, self.name)

        # Overlay network namespace.
        self.netns = netns.get(self.dry_run, self.logger, self.name)

        # Create the mesh tunnel interfaces.
        self.mesh_tunnels = []

        for i, node_link in enumerate(self._node_links()):
            # Check if this link requires a tunnel on this host. If not,
            # continue.
            if node_link[0] != self.this_node[0]:
                continue

            # Mesh tunnel interface name, made from the BGP AS number
            # of this overlay and the node pair number.
            name = "m%il%i" % (self.asn, math.floor(i / 2))

            node_local = node_link[0]
            node_remote = node_link[1]

            physical_local = self.this_node[1]
            physical_remote = None
            for node, address in self.nodes:
                if node == node_remote:
                    physical_remote = address
                    break

            virtual_local = self.linknet_pool.network_address + i
            virtual_remote = util.ip_address_remote(virtual_local)

            if (virtual_local > self.linknet_pool.broadcast_address or
                    virtual_remote > self.linknet_pool.broadcast_address):
                raise LinknetPoolOverflowError(self, node_link)

            self.mesh_tunnels.append(mesh_tunnel.create(
                self.logger,
                name,
                node_local,
                node_remote,
                physical_local,
                physical_remote,
                virtual_local,
                virtual_remote,
            ))

        # Set up each interface with this overlay as the context.
        for mt in self.mesh_tunnels:
            mt.setup(self.daemon, self)

        for i in self.interfaces:
            i.setup(self.daemon, self)

        # Create the overlay's BGP and firewall process objects,
        # once the data structures are complete.
        self.bgp_process = bgp_process.create(self.daemon, self)
        self.firewall_process = firewall_process.create(self)

        self.set_setup()