def on_create_request(self, rsrc_id, rsrc_data): """ :returns ``dict``: Network IP `vip`, network device `veth`, IP gateway `gateway`. """ with lc.LogContext(_LOGGER, rsrc_id, adapter_cls=lc.ContainerAdapter) as log: log.debug('req: %r', rsrc_data) app_unique_name = rsrc_id environment = rsrc_data['environment'] assert environment in _SET_BY_ENVIRONMENT, \ 'Unknown environment: %r' % environment veth0, veth1 = _device_from_rsrc_id(app_unique_name) if app_unique_name not in self._devices: # VIPs allocation (the owner is the resource link) ip = self._vips.alloc(rsrc_id) self._devices[app_unique_name] = {'ip': ip} else: # Re-read what IP we assigned before ip = self._devices[app_unique_name]['ip'] if 'device' not in self._devices[app_unique_name]: # Create the interface pair netdev.link_add_veth(veth0, veth1) # Configure the links netdev.link_set_mtu(veth0, self.ext_mtu) netdev.link_set_mtu(veth1, self.ext_mtu) # Tag the interfaces netdev.link_set_alias(veth0, rsrc_id) netdev.link_set_alias(veth1, rsrc_id) # Add interface to the bridge netdev.bridge_addif(self._TMBR_DEV, veth0) netdev.link_set_up(veth0) # We keep veth1 down until inside the container # Record the new device in our state self._devices[app_unique_name] = _device_info(veth0) self._devices[app_unique_name].update({ 'ip': ip, 'environment': environment, }) # We can now mark ip traffic as belonging to the requested # environment. _add_mark_rule(ip, environment) result = { 'vip': ip, 'veth': veth1, 'gateway': self._TM_IP, 'external_ip': self.ext_ip, } return result
def test_link_set_alias(self): """Test configuration of device alias. """ netdev.link_set_alias('foo', 'hello world!') treadmill.subproc.check_call.assert_called_with( [ 'ip', 'link', 'set', 'dev', 'foo', 'alias', 'hello world!', ], )