def do_work(container): """ Performs initial startup actions with the container as requested in arguments. Then remains in container shell or infinite wait until container stops. Returns when container should stop. Raises an exception if anything failed. """ if opts.proc: # Run a one-off process (with the -x argument) mod, proc = opts.proc.rsplit('.', 1) print "pycc: Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, config={'process': { 'type': 'immediate' }}) # And end return if opts.rel: # Start a rel file start_ok = container.start_rel_from_url(opts.rel) if not start_ok: raise Exception("Cannot start deploy file '%s'" % opts.rel) if opts.mx: from pyon.public import CFG port = CFG.get_safe('container.flask_webapp.port', 8080) container.spawn_process("ContainerUI", "ion.core.containerui", "ContainerUI") print "pycc: Container UI started ... listening on http://localhost:%s" % port if opts.signalparent: import os import signal print 'pycc: Signal parent pid %d that pycc pid %d service start process is complete...' % ( os.getppid(), os.getpid()) os.kill(os.getppid(), signal.SIGUSR1) def is_parent_gone(): while os.getppid() != 1: gevent.sleep(1) print 'pycc: Now I am an orphan ... notifying serve_forever to stop' os.kill(os.getpid(), signal.SIGINT) import gevent ipg = gevent.spawn(is_parent_gone) container.gl_parent_watch = ipg if not opts.noshell and not opts.daemon: # Keep container running while there is an interactive shell from pyon.container.shell_api import get_shell_api setup_ipython_shell(get_shell_api(container)) elif not opts.nomanhole: from pyon.container.shell_api import get_shell_api setup_ipython_embed(get_shell_api(container)) else: container.serve_forever()
def do_work(container): """ Performs initial startup actions with the container as requested in arguments. Then remains in container shell or infinite wait until container stops. Returns when container should stop. Raises an exception if anything failed. """ if opts.proc: # Run a one-off process (with the -x argument) mod, proc = opts.proc.rsplit('.', 1) print "pycc: Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, config={'process':{'type':'immediate'}}) # And end return if opts.rel: # Start a rel file start_ok = container.start_rel_from_url(opts.rel) if not start_ok: raise Exception("Cannot start deploy file '%s'" % opts.rel) if opts.mx: from pyon.public import CFG port = CFG.get_safe('container.flask_webapp.port',8080) container.spawn_process("ContainerUI", "ion.core.containerui", "ContainerUI") print "pycc: Container UI started ... listening on http://localhost:%s" % port if opts.signalparent: import signal print 'pycc: Signal parent pid %d that pycc pid %d service start process is complete...' % (os.getppid(), os.getpid()) os.kill(os.getppid(), signal.SIGUSR1) def is_parent_gone(): while os.getppid() != 1: gevent.sleep(1) print 'pycc: Now I am an orphan ... notifying serve_forever to stop' os.kill(os.getpid(), signal.SIGINT) import gevent ipg = gevent.spawn(is_parent_gone) container.gl_parent_watch = ipg if opts.enable_gbmonitor: from pyon.util.gevent_block_plugin import get_gevent_monitor_block get_gevent_monitor_block().start() if not opts.noshell and not opts.daemon: # Keep container running while there is an interactive shell from pyon.container.shell_api import get_shell_api setup_ipython_shell(get_shell_api(container)) elif not opts.nomanhole: from pyon.container.shell_api import get_shell_api setup_ipython_embed(get_shell_api(container)) else: container.serve_forever()
def do_work(container): """ Performs initial startup actions with the container as requested in arguments. Then remains in container shell or infinite wait until container stops. Returns when container should stop. Raises an exception if anything failed. """ if opts.proc: # Run a one-off process (with the -x argument) mod, proc = opts.proc.rsplit('.', 1) print "pycc: Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, config={'process':{'type':'immediate'}}) # And end return if opts.rel: # Start a rel file start_ok = container.start_rel_from_url(opts.rel) if not start_ok: raise Exception("Cannot start deploy file '%s'" % opts.rel) if opts.mx: from pyon.public import CFG port = CFG.get_safe('process.admin_ui.web_server.port', 8080) container.spawn_process("admin_ui", "ion.processes.ui.admin_ui", "AdminUI") if opts.signalparent: import signal print 'pycc: Signal parent pid %d that pycc pid %d service start process is complete...' % (os.getppid(), os.getpid()) os.kill(os.getppid(), signal.SIGUSR1) def is_parent_gone(): while os.getppid() != 1: gevent.sleep(1) print 'pycc: Now I am an orphan ... notifying serve_forever to stop' os.kill(os.getpid(), signal.SIGINT) import gevent ipg = gevent.spawn(is_parent_gone) container.gl_parent_watch = ipg # The following will block until TERM signal - may exit with SystemExit if not opts.noshell and not opts.daemon: # Keep container running while there is an interactive shell from pyon.container.shell_api import get_shell_api setup_ipython_shell(get_shell_api(container)) elif not opts.nomanhole: # Keep container running while there is an embedded manhole core from pyon.container.shell_api import get_shell_api setup_ipython_embed(get_shell_api(container)) else: # Keep container running until all TERM container.serve_forever()
def do_work(container): """ Performs initial startup actions with the container as requested in arguments. Then remains in container shell or infinite wait until container stops. Returns when container should stop. Raises an exception if anything failed. """ if opts.proc: # Run a one-off process (with the -x argument) mod, proc = opts.proc.rsplit('.', 1) print "Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, config={'process':{'type':'immediate'}}) # And end return if opts.rel: # Start a rel file start_ok = container.start_rel_from_url(opts.rel) if not start_ok: raise Exception("Cannot start deploy file '%s'" % opts.rel) if opts.mx: container.spawn_process("ContainerUI", "ion.core.containerui", "ContainerUI") print "Container UI started ... listening on http://localhost:8080" if not opts.noshell and not opts.daemon: # Keep container running while there is an interactive shell from pyon.container.shell_api import get_shell_api setup_ipython(get_shell_api(container)) else: # Keep container running until process terminated container.serve_forever()
def breakpoint(scope=None): from IPython.config.loader import Config ipy_config = Config() ipy_config.PromptManager.in_template = '><> ' ipy_config.PromptManager.in2_template = '... ' ipy_config.PromptManager.out_template = '--> ' ipy_config.InteractiveShellEmbed.confirm_exit = False # monkeypatch the ipython inputhook to be gevent-friendly import gevent # should be auto-monkey-patched by pyon already. import select import sys def stdin_ready(): infds, outfds, erfds = select.select([sys.stdin], [], [], 0) if infds: return True else: return False def inputhook_gevent(): try: while not stdin_ready(): gevent.sleep(0.05) except KeyboardInterrupt: pass return 0 # install the gevent inputhook from IPython.lib.inputhook import inputhook_manager inputhook_manager.set_inputhook(inputhook_gevent) inputhook_manager._current_gui = 'gevent' # First import the embeddable shell class from IPython.frontend.terminal.embed import InteractiveShellEmbed from mock import patch if scope is not None: from pyon.container.shell_api import get_shell_api from pyon.container.cc import Container locals().update(scope) if Container.instance: locals().update(get_shell_api(Container.instance)) # Update namespace of interactive shell # TODO: Cleanup namespace even further # Now create an instance of the embeddable shell. The first argument is a # string with options exactly as you would type them if you were starting # IPython at the system command line. Any parameters you want to define for # configuration can thus be specified here. with patch("IPython.core.interactiveshell.InteractiveShell.init_virtualenv"): ipshell = InteractiveShellEmbed(config=ipy_config, banner1="Entering Breakpoint Shell", exit_msg = 'Returning...') stack = traceback.extract_stack(limit=2) message = 'File %s, line %s, in %s' % stack[0][:-1] ipshell('Breakpoint @ ' + message)
def main(opts, *args, **kwargs): import threading threading.current_thread().name = "CC-Main" # The import of pyon.public triggers many module initializers: # pyon.core.bootstrap (Config load, logging setup), etc. from pyon.public import Container, CFG # Check if user opted to override logging config if opts.logcfg: from pyon.util.config import logging_conf_paths, initialize_logging # Re-initialize logging logging_conf_paths.append(opts.logcfg) initialize_logging() from pyon.container.shell_api import get_shell_api # Set that system is not testing. We are running as standalone container CFG.system.testing = False container = Container(*args, **kwargs) # start and wait for container to signal ready ready = container.start() start_ok = True error_msg = None if opts.proc: # One off process mod, proc = opts.proc.rsplit('.', 1) print "Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, process_type='immediate') container.stop() return if opts.rel: start_ok = container.start_rel_from_url(opts.rel) if not start_ok: error_msg = "Cannot start deploy file '%s'" % opts.rel if start_ok: if not opts.noshell and not opts.daemon: setup_ipython(get_shell_api(container)) else: container.serve_forever() else: print "ABORTING CONTAINER START - ERROR: %s" % error_msg container.stop()
def do_work(container): """ Performs initial startup actions with the container as requested in arguments. Then remains in container shell or infinite wait until container stops. Returns when container should stop. Raises an exception if anything failed. """ if opts.proc: # Run a one-off process (with the -x argument) mod, proc = opts.proc.rsplit('.', 1) print "Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, config={'process':{'type':'immediate'}}) # And end return if opts.rel: # Start a rel file start_ok = container.start_rel_from_url(opts.rel) if not start_ok: raise Exception("Cannot start deploy file '%s'" % opts.rel) if opts.mx: container.spawn_process("ContainerUI", "ion.core.containerui", "ContainerUI") print "Container UI started ... listening on http://localhost:8080" if opts.signalparent: import os import signal print 'Signal parent pid %d that pycc pid %d service start process is complete...' % (os.getppid(), os.getpid()) os.kill(os.getppid(), signal.SIGUSR1) def is_parent_gone(): while os.getppid() != 1: gevent.sleep(1) print 'Now I am an orphan ... notifying serve_forever to stop' os.kill(os.getpid(), signal.SIGINT) import gevent ipg =gevent.spawn(is_parent_gone) from pyon.util.containers import dict_merge from pyon.public import CFG dict_merge(CFG, {'system':{'watch_parent': ipg}}, True) if not opts.noshell and not opts.daemon: # Keep container running while there is an interactive shell from pyon.container.shell_api import get_shell_api setup_ipython(get_shell_api(container)) else: # Keep container running until process terminated container.serve_forever()
def main(opts, *args, **kwargs): import threading threading.current_thread().name = "CC-Main" # The import of pyon.public triggers many module initializers: # pyon.core.bootstrap (Config load, logging setup), etc. from pyon.public import Container from pyon.container.shell_api import get_shell_api container = Container(*args, **kwargs) # start and wait for container to signal ready ready = container.start() start_ok = True error_msg = None if opts.proc: # One off process mod, proc = opts.proc.rsplit('.', 1) print "Starting process %s" % opts.proc container.spawn_process(proc, mod, proc, process_type='immediate') container.stop() return if opts.rel: start_ok = container.start_rel_from_url(opts.rel) if not start_ok: error_msg = "Cannot start deploy file '%s'" % opts.rel if start_ok: if not opts.noshell and not opts.daemon: setup_ipython(get_shell_api(container)) else: container.serve_forever() else: print "ABORTING CONTAINER START - ERROR: %s" % error_msg container.stop()
def do_work(container): """ Performs initial startup actions with the container as requested in arguments. Then remains in container shell or infinite wait until container stops. Returns when container should stop. Raises an exception if anything failed. """ if opts.proc: # Run a one-off process (with the -x argument) mod, proc = opts.proc.rsplit('.', 1) log.info("Starting process %s", opts.proc) container.spawn_process(proc, mod, proc, config={'process': { 'type': 'immediate' }}) # And end return if opts.rel: # Start a rel file start_ok = container.start_rel_from_url(opts.rel) if not start_ok: raise Exception("Cannot start deploy file '%s'" % opts.rel) if opts.mx: from pyon.public import CFG port = CFG.get_safe('process.admin_ui.web_server.port', 8080) container.spawn_process("admin_ui", "ion.process.ui.admin_ui", "AdminUI") if opts.signalparent: log.info( "Signal parent pid %d that pycc pid %d service start process is complete...", os.getppid(), os.getpid()) os.kill(os.getppid(), signal.SIGUSR1) def is_parent_gone(): while os.getppid() != 1: gevent.sleep(1) log.info( "Now I am an orphan ... notifying serve_forever to stop") os.kill(os.getpid(), signal.SIGINT) import gevent ipg = gevent.spawn(is_parent_gone) container.gl_parent_watch = ipg # The following will block until TERM signal - may exit with SystemExit if not opts.noshell and not opts.daemon: # Keep container running while there is an interactive shell from pyon.container.shell_api import get_shell_api setup_ipython_shell(get_shell_api(container)) elif not opts.nomanhole: # Keep container running while there is an embedded manhole core from pyon.container.shell_api import get_shell_api setup_ipython_embed(get_shell_api(container)) else: # Keep container running until all TERM container.serve_forever()
def breakpoint(scope=None, global_scope=None): from IPython.config.loader import Config ipy_config = Config() ipy_config.PromptManager.in_template = '><> ' ipy_config.PromptManager.in2_template = '... ' ipy_config.PromptManager.out_template = '--> ' ipy_config.InteractiveShellEmbed.confirm_exit = False # monkeypatch the ipython inputhook to be gevent-friendly import gevent # should be auto-monkey-patched by pyon already. import select import sys def stdin_ready(): infds, outfds, erfds = select.select([sys.stdin], [], [], 0) if infds: return True else: return False def inputhook_gevent(): try: while not stdin_ready(): gevent.sleep(0.05) except KeyboardInterrupt: pass return 0 # install the gevent inputhook from IPython.lib.inputhook import inputhook_manager inputhook_manager.set_inputhook(inputhook_gevent) inputhook_manager._current_gui = 'gevent' # First import the embeddable shell class from IPython.frontend.terminal.embed import InteractiveShellEmbed from mock import patch if scope is not None: from pyon.container.shell_api import get_shell_api from pyon.container.cc import Container locals().update(scope) locals().update({'bt': get_stack}) if Container.instance: locals().update(get_shell_api(Container.instance)) if global_scope is not None: globals().update(global_scope) from pyon.core.bootstrap import get_sys_name # Update namespace of interactive shell # TODO: Cleanup namespace even further # Now create an instance of the embeddable shell. The first argument is a # string with options exactly as you would type them if you were starting # IPython at the system command line. Any parameters you want to define for # configuration can thus be specified here. with patch( "IPython.core.interactiveshell.InteractiveShell.init_virtualenv"): ipshell = InteractiveShellEmbed(config=ipy_config, banner1="Entering Breakpoint Shell", exit_msg='Returning...') stack = traceback.extract_stack(limit=2) message = 'File %s, line %s, in %s' % stack[0][:-1] ipshell('(%s) Breakpoint @ %s' % (get_sys_name(), message))