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
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
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)
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
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)