def test_netns_check_dns(self): # Find nameserver address and use it fd = open('/etc/resolv.conf', 'r') self.nameserver_ip = None for elem in fd.readlines(): match = re.match('nameserver\s+(\S+)', elem) if match: logger.debug("Nameserver IP is {}".format(match.group(1))) self.nameserver_ip = match.group(1) if self.nameserver_ip: fake_nameserver = "nameserver " + self.nameserver_ip + "\n" else: fake_nameserver = "nameserver 1.1.1.1\n" new_resolvconf_hdl = tempfile.NamedTemporaryFile(delete=False) new_resolvconf_hdl_path = new_resolvconf_hdl.name new_resolvconf_hdl.write(fake_nameserver) new_resolvconf_hdl.close() logger.debug("Temp file name is :{}".format(new_resolvconf_hdl_path)) RwNetns.mount_bind_resolv_conf(new_resolvconf_hdl_path) a = urllib2.urlopen("http://www.google.com", timeout=1) self.assertEqual(a.getcode(), 200) logger.debug("URL return code is :{}".format(a.getcode())) os.remove(new_resolvconf_hdl_path)
def test_netns_check_dns(self): # Find nameserver address and use it fd = open('/etc/resolv.conf','r') self.nameserver_ip = None for elem in fd.readlines(): match = re.match('nameserver\s+(\S+)',elem) if match: logger.debug("Nameserver IP is {}" .format(match.group(1))) self.nameserver_ip = match.group(1) if self.nameserver_ip: fake_nameserver = "nameserver "+ self.nameserver_ip + "\n" else: fake_nameserver = "nameserver 1.1.1.1\n" new_resolvconf_hdl = tempfile.NamedTemporaryFile(delete=False) new_resolvconf_hdl_path = new_resolvconf_hdl.name new_resolvconf_hdl.write(fake_nameserver) new_resolvconf_hdl.close() logger.debug("Temp file name is :{}".format(new_resolvconf_hdl_path)) RwNetns.mount_bind_resolv_conf(new_resolvconf_hdl_path) a = urllib2.urlopen("http://www.google.com", timeout=1) self.assertEqual(a.getcode(),200) logger.debug("URL return code is :{}".format(a.getcode())) os.remove(new_resolvconf_hdl_path)
def test_netns_create(self): create_rc = RwNetns.create_context("foo") self.assertTrue(create_rc >= 0) logger.debug("Create Context Foo Rc:{}".format(create_rc)) foo_fd = RwNetns.get_netfd("foo") self.assertTrue(foo_fd >= 0) logger.debug("Get foo fd: {}".format(foo_fd)) delete_rc = RwNetns.delete_context("foo") self.assertEqual(delete_rc,0) logger.debug("Delete Context Foo Rc:{}" .format(delete_rc))
def test_netns_create(self): create_rc = RwNetns.create_context("foo") self.assertTrue(create_rc >= 0) logger.debug("Create Context Foo Rc:{}".format(create_rc)) foo_fd = RwNetns.get_netfd("foo") self.assertTrue(foo_fd >= 0) logger.debug("Get foo fd: {}".format(foo_fd)) delete_rc = RwNetns.delete_context("foo") self.assertEqual(delete_rc, 0) logger.debug("Delete Context Foo Rc:{}".format(delete_rc))
def _unmount_resolv_conf(self): self._log_event(UnmountingResolvConf()) unbind_rc = RwNetns.unmount_resolv_conf() if unbind_rc != 0: self._log_event(UnmountingResolvConfFailed(), rc=unbind_rc) raise NetworkNamespaceException("Could not unbind netns resolv conf (%s). rc=%s" % (self.resolv_conf_path, unbind_rc))
def setUp(self): self.original_fd = RwNetns.get_current_netfd() logger.debug("Original netfd: {}".format(self.original_fd)) if os.geteuid() != 0: exit( "You need to have root privileges to run this script. Exiting." )
def _unmount_resolv_conf(self): self._log_event(UnmountingResolvConf()) unbind_rc = RwNetns.unmount_resolv_conf() if unbind_rc != 0: self._log_event(UnmountingResolvConfFailed(), rc=unbind_rc) raise NetworkNamespaceException( "Could not unbind netns resolv conf (%s). rc=%s" % (self.resolv_conf_path, unbind_rc))
def exit(self): self._log_event(ExitingNetns()) if self._bind_resolv_conf: self._unmount_resolv_conf() change_rc = RwNetns.change_fd(self._current_fd) if change_rc != 0: self._log_event(ChangeNetnsFdFailed(), rc=change_rc) raise NetworkNamespaceException("Change back to default namespace fd (%s) failed with rc == %s." % (self._current_fd, change_rc))
def exit(self): self._log_event(ExitingNetns()) if self._bind_resolv_conf: self._unmount_resolv_conf() change_rc = RwNetns.change_fd(self._current_fd) if change_rc != 0: self._log_event(ChangeNetnsFdFailed(), rc=change_rc) raise NetworkNamespaceException( "Change back to default namespace fd (%s) failed with rc == %s." % (self._current_fd, change_rc))
def __init__(self, netns_name, bind_resolv_conf=True): if not isinstance(netns_name, six.string_types): raise TypeError("netns is expected to be a string: %s", netns_name) self._netns_name = netns_name self._current_fd = RwNetns.get_current_netfd() self._bind_resolv_conf = bind_resolv_conf if self._current_fd <= 0: self._log_event(GetNetnsFdFailed(), rc=self._current_fd) raise NetworkNamespaceException("Get current namespace fd failed with rc == %s." % self._current_fd)
def test_netns_change(self): create_rc = RwNetns.create_context("bar") self.assertTrue(create_rc >= 0) logger.debug("Create Context Bar Rc:{}".format(create_rc)) bar_fd = RwNetns.get_netfd("bar") self.assertTrue(bar_fd >= 0) logger.debug("Get bar fd: {}".format(bar_fd)) change_rc = RwNetns.change("bar") self.assertEqual(change_rc, 0) logger.debug("Change Context Bar Rc:{}".format(change_rc)) current_fd = RwNetns.get_current_netfd() self.assertTrue(current_fd >= 0) logger.debug("Current netfd:{}".format(current_fd)) change_fd_rc = RwNetns.change_fd(self.original_fd) self.assertEqual(change_fd_rc, 0) logger.debug("Change fd {} Rc: {}".format(self.original_fd, change_fd_rc)) delete_rc = RwNetns.delete_context("bar") self.assertEqual(delete_rc, 0) logger.debug("Delete Context Foo Rc: {}".format(delete_rc))
def __init__(self, netns_name, bind_resolv_conf=True): if not isinstance(netns_name, six.string_types): raise TypeError("netns is expected to be a string: %s", netns_name) self._netns_name = netns_name self._current_fd = RwNetns.get_current_netfd() self._bind_resolv_conf = bind_resolv_conf if self._current_fd <= 0: self._log_event(GetNetnsFdFailed(), rc=self._current_fd) raise NetworkNamespaceException( "Get current namespace fd failed with rc == %s." % self._current_fd)
def _mount_resolv_conf(self): if not os.path.isfile(self.resolv_conf_path): self._log_event(MissingResolvConf()) raise NetworkNamespaceException("Network namespace resolv.conf file does not exist: %s" % self.resolv_conf_path) with open(self.resolv_conf_path) as resolv_conf_hdl: self._log_event(MountingResolvConf(), content=resolv_conf_hdl.read()) bind_rc = RwNetns.mount_bind_resolv_conf(self.resolv_conf_path) if bind_rc != 0: self._log_event(MountingResolvConfFailed, rc=bind_rc) raise NetworkNamespaceException("Could not mount netns resolv conf (%s). rc=%s" % (self.resolv_conf_path, bind_rc))
def _mount_resolv_conf(self): if not os.path.isfile(self.resolv_conf_path): self._log_event(MissingResolvConf()) raise NetworkNamespaceException( "Network namespace resolv.conf file does not exist: %s" % self.resolv_conf_path) with open(self.resolv_conf_path) as resolv_conf_hdl: self._log_event(MountingResolvConf(), content=resolv_conf_hdl.read()) bind_rc = RwNetns.mount_bind_resolv_conf(self.resolv_conf_path) if bind_rc != 0: self._log_event(MountingResolvConfFailed, rc=bind_rc) raise NetworkNamespaceException( "Could not mount netns resolv conf (%s). rc=%s" % (self.resolv_conf_path, bind_rc))
def enter(self): self._log_event(EnteringNetns()) if NetnsEnvironment.current_netns is not None: self._log_event(MultipleNetnsError(), current_netns_name=NetnsEnvironment.current_netns.name) raise NetworkNamespaceException("Cannot enter more than one network namespace (already in %s)", NetnsEnvironment.current_netns.name) change_rc = RwNetns.change(self._netns_name) if change_rc != 0: self._log_event(ChangeNetnsFailed(), rc=change_rc) raise NetworkNamespaceException("Change to namespace (%s) failed with rc == %s." % (self._netns_name, change_rc)) if self._bind_resolv_conf: self._mount_resolv_conf()
def enter(self): self._log_event(EnteringNetns()) if NetnsEnvironment.current_netns is not None: self._log_event( MultipleNetnsError(), current_netns_name=NetnsEnvironment.current_netns.name) raise NetworkNamespaceException( "Cannot enter more than one network namespace (already in %s)", NetnsEnvironment.current_netns.name) change_rc = RwNetns.change(self._netns_name) if change_rc != 0: self._log_event(ChangeNetnsFailed(), rc=change_rc) raise NetworkNamespaceException( "Change to namespace (%s) failed with rc == %s." % (self._netns_name, change_rc)) if self._bind_resolv_conf: self._mount_resolv_conf()
def test_netns_change(self): create_rc = RwNetns.create_context("bar") self.assertTrue(create_rc >= 0) logger.debug("Create Context Bar Rc:{}" .format(create_rc)) bar_fd = RwNetns.get_netfd("bar") self.assertTrue(bar_fd >= 0) logger.debug("Get bar fd: {}" .format(bar_fd)) change_rc = RwNetns.change("bar") self.assertEqual(change_rc,0) logger.debug("Change Context Bar Rc:{}" .format(change_rc)) current_fd = RwNetns.get_current_netfd() self.assertTrue(current_fd >= 0) logger.debug("Current netfd:{}" .format(current_fd)) change_fd_rc = RwNetns.change_fd(self.original_fd) self.assertEqual(change_fd_rc,0) logger.debug("Change fd {} Rc: {}" .format(self.original_fd, change_fd_rc)) delete_rc = RwNetns.delete_context("bar") self.assertEqual(delete_rc,0) logger.debug("Delete Context Foo Rc: {}" .format(delete_rc))
def setUp(self): self.original_fd = RwNetns.get_current_netfd() logger.debug("Original netfd: {}" .format(self.original_fd)) if os.geteuid() != 0: exit("You need to have root privileges to run this script. Exiting.")