Beispiel #1
0
    def configure(self):
        ns_name = self.context.make_network_namespace_name()
        name = self.make_name()
        left, right = name
        ip = self.get_ipdb()
        klass = type(self)

        self.iface_set_up(left)

        try:
            with ip.interfaces[right] as iface:
                iface.net_ns_fd = ns_name
        except OSError as e:
            raise exc.SystemResourceError(klass, name) from e
        except KeyError:
            # perhaps someone already move iface into our NS
            pass

        nsip = self.context.shared_registry.fetch(NetworkNamespace)
        iface_index = self.ns_gw_name
        try:
            with nsip.interfaces[right] as iface:
                iface_index = iface.index
                iface.ifname = self.ns_gw_name
                iface.up()
        except OSError as e:
            raise exc.SystemResourceError(klass, name) from e
        except KeyError:
            # perhaps someone already rename iface, check it
            try:
                with ip.interfaces[left].ro as iface_left:
                    with nsip.interfaces[self.ns_gw_name].ro as iface_right:
                        ok = iface_left['kind'] == iface_right['kind'] == 'veth'
                        ok = ok and iface_left['peer'] == right

                        if not ok:
                            raise exc.SystemResourceDamagedError(
                                klass, name,
                                'is not a veth pair created in previous '
                                'step')
            except KeyError as e:
                raise exc.SystemResourceNotFoundError(klass, str(e))

        self.context.shared_registry.add(klass,
                                         GWDescriptor(left, self.ns_gw_name))
        self.context.shared_registry.add(GatewayIfaceDescriptor,
                                         GatewayIfaceDescriptor(iface_index))
Beispiel #2
0
    def release(self):
        super().release()

        name = self.context.make_network_namespace_name()
        try:
            pyroute2.netns.remove(name)
        except OSError as e:
            raise exc.SystemResourceError(type(self), name) from e
Beispiel #3
0
 def iface_set_up(self, name):
     klass = type(self)
     try:
         with self.get_ipdb().interfaces[name] as iface:
             iface.up()
     except OSError as e:
         raise exc.SystemResourceError(klass, name) from e
     except KeyError:
         raise exc.SystemResourceNotFoundError(klass, name)
Beispiel #4
0
 def create(self):
     name = self.context.make_network_namespace_name()
     klass = type(self)
     try:
         pyroute2.netns.create(name)
     except OSError as e:
         if e.errno == errno.EEXIST:
             raise exc.SystemResourceExistsError(klass, name)
         raise exc.SystemResourceError(klass, name) from e
Beispiel #5
0
 def iface_drop_all_addresses(self, name):
     klass = type(self)
     try:
         with self.get_ipdb().interfaces[name] as iface:
             for addr in tuple(iface.ipaddr):
                 iface.del_ip(*addr)
     except OSError as e:
         raise exc.SystemResourceError(klass, name) from e
     except KeyError:
         raise exc.SystemResourceNotFoundError(klass, self.context.iface)
Beispiel #6
0
 def configure(self):
     name = self.context.make_bridge_name()
     klass = type(self)
     try:
         self._make_bridge_ifadd(name)
         self._make_bridge_setup(name)
     except OSError as e:
         raise exc.SystemResourceError(klass, name) from e
     except KeyError:
         raise exc.SystemResourceDamagedError(klass, name,
                                              'interface not found')
Beispiel #7
0
    def create(self):
        name = self.context.make_network_namespace_name()
        klass = type(self)
        try:
            pyroute2.netns.create(name)
        except OSError as e:
            if e.errno == errno.EEXIST:
                raise exc.SystemResourceExistsError(klass, name)
            raise exc.SystemResourceError(klass, name) from e

        self._sysctl(name, 'net.ipv6.conf.default.disable_ipv6', 1)
Beispiel #8
0
    def create(self):
        name = self.make_name()
        left, right = name
        klass = type(self)

        try:
            with self.get_ipdb().create(kind='veth', ifname=left, peer=right):
                # don't do any extra configuration here
                pass
        except pyroute2.CreateException:
            raise exc.SystemResourceExistsError(klass, name)
        except Exception as e:
            raise exc.SystemResourceError(klass, name) from e
Beispiel #9
0
    def configure(self):
        veth = self.context.shared_registry.fetch(VEthPair)
        veth_index = self.iface_get_info(veth.root).index

        try:
            with self.get_ipdb().interfaces[self.context.iface.index] as iface:
                iface.add_port(veth_index)
        except OSError as e:
            raise exc.SystemResourceError(type(self), veth.root) from e
        except KeyError:
            raise exc.SystemResourceDamagedError(type(self),
                                                 self.context.iface.name,
                                                 'interface not found')
Beispiel #10
0
    def configure(self):
        name = self.context.make_bridge_name()
        veth = self.context.shared_registry.fetch(VEthPair)

        need_ports = {
            self.context.iface.index,
            self.iface_get_info(veth.root).index
        }

        klass = type(self)
        try:
            with self.get_ipdb().interfaces[name] as iface:
                iface.up()
                ports = set(iface.ports)
                for port in ports - need_ports:
                    iface.del_port(port)
                for port in need_ports - ports:
                    iface.add_port(port)
        except OSError as e:
            raise exc.SystemResourceError(klass, name) from e
        except KeyError:
            raise exc.SystemResourceDamagedError(klass, name,
                                                 'interface not found')