Example #1
0
    def prepare_machine(self):
        self.rpc_call("prepare_machine")
        self._send_device_classes()
        self.rpc_call("init_if_manager")

        self._device_database = {}

        devices = self.rpc_call("get_devices")
        for ifindex, dev in list(devices.items()):
            remote_dev = RemoteDevice(Device)
            remote_dev._machine = self
            remote_dev.ifindex = ifindex
            remote_dev.netns = self._initns

            self._device_database[ifindex] = remote_dev
Example #2
0
    def set_recipe(self, recipe_name):
        """ Reserves the machine for the specified recipe

        Also sends Device classes from the controller and initializes the
        InterfaceManager on the Slave and builds the device database.
        """
        self.rpc_call("set_recipe", recipe_name)
        self._send_device_classes()
        self.rpc_call("init_if_manager")

        devices = self.rpc_call("get_devices")
        for if_index, dev in devices.items():
            remote_dev = RemoteDevice(Device)
            remote_dev.host = self
            remote_dev.if_index = if_index

            self._device_database[if_index] = remote_dev
Example #3
0
def VethPair(*args, **kwargs):
    """Creates a pair of Veth Devices

    Args:
        args, kwargs passed to the VethDevice constructor on the Agent.
    """
    first = RemoteDevice(VethDevice, args, kwargs)
    second = PairedRemoteDevice(first, PairedVethDevice)
    return (first, second)
Example #4
0
    def device_created(self, dev_data):
        if_index = dev_data["if_index"]
        if if_index not in self._device_database:
            new_dev = None
            if len(self._tmp_device_database) > 0:
                for dev in self._tmp_device_database:
                    if dev._match_update_data(dev_data):
                        new_dev = dev
                        break

            if new_dev is None:
                new_dev = RemoteDevice(Device)
                new_dev.host = self
                new_dev.if_index = if_index
            else:
                self._tmp_device_database.remove(new_dev)

                new_dev.if_index = dev_data["if_index"]

            self._device_database[if_index] = new_dev
Example #5
0
    def device_created(self, dev_data, netns=None):
        ns_instance = self._get_netns_by_name(netns)
        ifindex = dev_data["ifindex"]
        if ifindex not in [
                idx for idx in self._device_database[ns_instance].keys()
        ]:
            new_dev = None
            if len(self._tmp_device_database) > 0:
                for dev in self._tmp_device_database:
                    if dev._match_update_data(dev_data):
                        new_dev = dev
                        break

            moved_dev_match = [
                dev for dev, dev_details in self._netns_moved_devices.items()
                if dev_details["dst"] == ns_instance
                and dev_details["new_ifindex"] == ifindex
            ]

            netns_moved = False
            if len(moved_dev_match):
                new_dev = moved_dev_match[0]
                netns_moved = True

            if new_dev is None:
                if dev_data["driver"] == "loopback":
                    new_dev = RemoteDevice(LoopbackDevice)
                else:
                    new_dev = RemoteDevice(Device)
                new_dev._machine = self
                new_dev.ifindex = ifindex
                new_dev.netns = ns_instance
            else:
                if netns_moved:
                    del self._netns_moved_devices[new_dev]
                    new_dev.disable_readonly_cache()
                else:
                    self._tmp_device_database.remove(new_dev)
                    new_dev.ifindex = dev_data["ifindex"]

            self._add_device_to_database(ifindex, new_dev, ns_instance)