Example #1
0
def main():

    global shutdown
    global accept_offers
    global driver

    cfg = get_configuration()

    # Configure logging
    setup_logging(cfg)

    framework = mesos_framework(cfg)
    #credentials = mesos_credentials(cfg)

    mesos_scheduler = OurJobScheduler(cfg)
    #driver = MesosSchedulerDriver(mesos_scheduler, framework,
    #                              cfg.mesos.master, cfg.mesos.imp_ack,
    #                              credentials)
    driver = MesosSchedulerDriver(mesos_scheduler, framework, cfg.mesos.master,
                                  cfg.mesos.imp_ack)

    shutdown = Shutdown()
    accept_offers = AcceptOffers()

    # driver.run() blocks, so run it in a separate thread.
    def run_driver_async():
        status = 0 if driver.run() == MesosPb2.DRIVER_STOPPED else 1

        if cfg.debug > 0:
            logger.debug('Stopping Driver')
        driver.stop()

        logger.info('Terminating Framework')
        sys.exit(status)

    framework_thread = Thread(target=run_driver_async, args=())
    framework_thread.start()

    logger.info('Beginning Processing')

    while framework_thread.is_alive():
        # If a shutdown has been requested, suppress offers and wait for the
        # framework thread to complete.
        if shutdown.flag:
            if cfg.debug > 0:
                logger.debug('Suppressing Offers')
            driver.suppressOffers()

            while framework_thread.is_alive():
                logger.debug('Child Thread Still Alive')
                sleep(5)

            break

        # If the max number of jobs are already running, suppress offers and
        # wait for some jobs to finish.
        if (mesos_scheduler.tasks_launched == cfg.mesos.max_jobs):
            driver.suppressOffers()

            if cfg.debug > 0:
                logger.debug('Suppressing Offers')

            # Sleep until we have room for more tasks
            while (not shutdown.flag
                   and mesos_scheduler.tasks_launched == cfg.mesos.max_jobs):
                if cfg.debug > 0:
                    logger.debug('Waiting for more available tasks')
                sleep(5)

            # Sleep until more processing is requested
            while not shutdown.flag and not mesos_scheduler.have_work():
                if cfg.debug > 0:
                    logger.debug('Waiting for more work')
                sleep(5)

            if not shutdown.flag:
                if cfg.debug > 0:
                    logger.debug('Reviving Offers')
                driver.reviveOffers()

        # If there's no new work to be done, suppress offers until we have
        # more work
        if not shutdown.flag and not mesos_scheduler.have_work():
            driver.suppressOffers()

            # Sleep until more processing is requested
            while not shutdown.flag and not mesos_scheduler.have_work():
                if cfg.debug > 0:
                    logger.debug('Waiting for more work')
                sleep(5)

            if not shutdown.flag:
                if cfg.debug > 0:
                    logger.debug('Reviving Offers')
                driver.reviveOffers()

        # Sleep for a second, so that we are not flying through the loop
        sleep(1)

    logger.info('Terminated Processing')