def setUp(self): self.orig_dir = os.getcwd() os.chdir(TestCase.directory) try: # Force use of fake 'ssh' and 'scp'. ssh = ("python", os.path.join(_TST_ROOT, "ssh.py"), _DMZ_ROOT) scp = ("python", os.path.join(_TST_ROOT, "scp.py"), _DMZ_ROOT) self.orig_ssh = protocol.configure_ssh(ssh) self.orig_scp = protocol.configure_scp(scp) # Avoid lots of polling log entries. if logging.getLogger().getEffectiveLevel() < logging.DEBUG: logging.getLogger().setLevel(logging.DEBUG) # Start RJE server. hostname = socket.gethostname() self.proc = start_server(hostname) # Create NAS_Allocator referring to server. logging.debug("create allocator") self.allocator = NAS_Allocator() parser = ConfigParser.ConfigParser() section = self.allocator.name parser.add_section(section) parser.set(section, "dmz_host", hostname) parser.set(section, "server_host", hostname) self.allocator.configure(parser) # Add allocator to RAM. RAM.add_allocator(self.allocator) except Exception: os.chdir(self.orig_dir) raise
def setUp(self): self.orig_dir = os.getcwd() os.chdir(TestCase.directory) try: # Force use of fake 'ssh' and 'scp'. ssh = ('python', os.path.join(_TST_ROOT, 'ssh.py'), _DMZ_ROOT) scp = ('python', os.path.join(_TST_ROOT, 'scp.py'), _DMZ_ROOT) self.orig_ssh = protocol.configure_ssh(ssh) self.orig_scp = protocol.configure_scp(scp) # Avoid lots of polling log entries. if logging.getLogger().getEffectiveLevel() < logging.DEBUG: logging.getLogger().setLevel(logging.DEBUG) # Start RJE server. hostname = socket.gethostname() self.proc = start_server(hostname) # Create NAS_Allocator referring to server. logging.debug('create allocator') self.allocator = NAS_Allocator() parser = ConfigParser.ConfigParser() section = self.allocator.name parser.add_section(section) parser.set(section, 'dmz_host', hostname) parser.set(section, 'server_host', hostname) self.allocator.configure(parser) # Add allocator to RAM. RAM.add_allocator(self.allocator) except Exception: os.chdir(self.orig_dir) raise
def tearDown(self): try: logging.debug("remove") RAM.remove_allocator(self.allocator.name) if self.proc is not None: logging.debug("shutdown") self.allocator.shutdown() self.proc.terminate() else: self.allocator.invalidate() # Restore 'ssh' and 'scp' configuration. protocol.configure_ssh(self.orig_ssh) protocol.configure_scp(self.orig_scp) time.sleep(2) for name in (_RJE_ROOT, _DMZ_ROOT): if os.path.exists(name): shutil.rmtree(name) finally: os.chdir(self.orig_dir)
def tearDown(self): try: logging.debug('remove') RAM.remove_allocator(self.allocator.name) if self.proc is not None: logging.debug('shutdown') self.allocator.shutdown() self.proc.terminate() else: self.allocator.invalidate() # Restore 'ssh' and 'scp' configuration. protocol.configure_ssh(self.orig_ssh) protocol.configure_scp(self.orig_scp) time.sleep(2) for name in (_RJE_ROOT, _DMZ_ROOT): if os.path.exists(name): shutil.rmtree(name) finally: os.chdir(self.orig_dir)
def main(): # pragma no cover """ Runs the RJE server. Usage: python rje.py [--allocator=name][--dmz-host=name][--poll-delay=secs][--resources=filename] --allocator: string Allocator to provide remote access to. Default ``PBS``. --dmz-host: string DMZ file server to use. Default ``dmzfs1``. --poll-delay: int Maximum seconds between checks for new client activity. Default 60. --resources: string Filename for resource configuration. If not specified then the default of ``~/.openmdao/resources.cfg`` will be used. """ parser = optparse.OptionParser() parser.add_option('--allocator', action='store', type='str', default='PBS', help='Allocator to provide remote access to') parser.add_option('--dmz-host', action='store', type='str', default='dmzfs1', help='DMZ file server to use') parser.add_option( '--poll-delay', action='store', type='int', default=60, help='Max seconds between checks for new client activity') parser.add_option('--resources', action='store', type='str', default=None, help='Filename for resource configuration') parser.add_option('--ssh', action='store', type='str', default=None, help='ssh command (used during testing)') parser.add_option('--scp', action='store', type='str', default=None, help='scp command (used during testing)') options, arguments = parser.parse_args() if arguments: parser.print_help() sys.exit(1) logger = logging.getLogger() logger.setLevel(logging.DEBUG) # Configure ssh and scp. if options.ssh: configure_ssh(options.ssh.split()) if options.scp: configure_scp(options.scp.split()) # Optionally configure resources. if options.resources is not None: RAM.configure(options.resources) # Get allocator to wrap. try: allocator = RAM.get_allocator(options.allocator) except ValueError: msg = "Can't find allocator %r" % options.allocator print msg logger.error(msg) sys.exit(1) dmz_host = options.dmz_host poll_delay = options.poll_delay # Initialize DMZ protocol. server_init(dmz_host, logger) global _DMZ_HOST _DMZ_HOST = dmz_host msg = 'RJE server ready' print msg logger.info(msg) # Setup for cleanup by this process only. global _RJE_PID _RJE_PID = os.getpid() signal.signal(signal.SIGTERM, _sigterm_handler) # And away we go... wrappers = {} try: delay = 1 # Start with high polling rate. while True: conn_info, removed = server_accept(dmz_host, poll_delay, logger) for client in removed: wrapper = wrappers.pop(client, None) if wrapper is not None: wrapper.shutdown() if conn_info is None: server_heartbeat(dmz_host, poll_delay, logger) delay = min(delay + 1, poll_delay) # Back-off. time.sleep(delay) else: client, connection = conn_info wrapper = AllocatorWrapper(allocator, client, connection) handler = threading.Thread(name='%s_handler' % client, target=wrapper.process_requests) handler.daemon = True handler.start() wrappers[client] = wrapper delay = 1 # Reset. except KeyboardInterrupt: pass finally: _cleanup() sys.exit(0)
def main(): # pragma no cover """ Runs the RJE server. Usage: python rje.py [--allocator=name][--dmz-host=name][--poll-delay=secs][--resources=filename] --allocator: string Allocator to provide remote access to. Default ``PBS``. --dmz-host: string DMZ file server to use. Default ``dmzfs1``. --poll-delay: int Maximum seconds between checks for new client activity. Default 60. --resources: string Filename for resource configuration. If not specified then the default of ``~/.openmdao/resources.cfg`` will be used. """ parser = optparse.OptionParser() parser.add_option('--allocator', action='store', type='str', default='PBS', help='Allocator to provide remote access to') parser.add_option('--dmz-host', action='store', type='str', default='dmzfs1', help='DMZ file server to use') parser.add_option('--poll-delay', action='store', type='int', default=60, help='Max seconds between checks for new client activity') parser.add_option('--resources', action='store', type='str', default=None, help='Filename for resource configuration') parser.add_option('--ssh', action='store', type='str', default=None, help='ssh command (used during testing)') parser.add_option('--scp', action='store', type='str', default=None, help='scp command (used during testing)') options, arguments = parser.parse_args() if arguments: parser.print_help() sys.exit(1) logger = logging.getLogger() logger.setLevel(logging.DEBUG) # Configure ssh and scp. if options.ssh: configure_ssh(options.ssh.split()) if options.scp: configure_scp(options.scp.split()) # Optionally configure resources. if options.resources is not None: RAM.configure(options.resources) # Get allocator to wrap. try: allocator = RAM.get_allocator(options.allocator) except ValueError: msg = "Can't find allocator %r" % options.allocator print msg logger.error(msg) sys.exit(1) dmz_host = options.dmz_host poll_delay = options.poll_delay # Initialize DMZ protocol. server_init(dmz_host, logger) global _DMZ_HOST _DMZ_HOST = dmz_host msg = 'RJE server ready' print msg logger.info(msg) # Setup for cleanup by this process only. global _RJE_PID _RJE_PID = os.getpid() signal.signal(signal.SIGTERM, _sigterm_handler) # And away we go... wrappers = {} try: delay = 1 # Start with high polling rate. while True: conn_info, removed = server_accept(dmz_host, poll_delay, logger) for client in removed: wrapper = wrappers.pop(client, None) if wrapper is not None: wrapper.shutdown() if conn_info is None: server_heartbeat(dmz_host, poll_delay, logger) delay = min(delay + 1, poll_delay) # Back-off. time.sleep(delay) else: client, connection = conn_info wrapper = AllocatorWrapper(allocator, client, connection) handler = threading.Thread(name='%s_handler' % client, target=wrapper.process_requests) handler.daemon = True handler.start() wrappers[client] = wrapper delay = 1 # Reset. except KeyboardInterrupt: pass finally: _cleanup() sys.exit(0)