def test_get_taskqueue_nodes(self, read_mock): # Not empty read_mock.return_value = '192.168.0.1\n129.168.0.2\n184.48.65.89' self.assertEquals( appscale_info.get_taskqueue_nodes(), ['192.168.0.1', '129.168.0.2', '184.48.65.89'], ) read_mock.assert_called_once_with('/etc/appscale/taskqueue_nodes') # Empty read_mock.return_value = '' self.assertEquals(appscale_info.get_taskqueue_nodes(), [])
def test_get_taskqueue_nodes(self, read_mock): # Not empty read_mock.return_value = '192.168.0.1\n129.168.0.2\n184.48.65.89' self.assertEquals( appscale_info.get_taskqueue_nodes(), ['192.168.0.1','129.168.0.2','184.48.65.89'], ) read_mock.assert_called_once_with('/etc/appscale/taskqueue_nodes') # Empty read_mock.return_value = '' self.assertEquals(appscale_info.get_taskqueue_nodes(), [])
def test_get_taskqueue_nodes(self): flexmock(file_io).should_receive("mkdir").and_return(None) flexmock(file_io).should_receive("read").\ and_return("192.168.0.1\n129.168.0.2\n184.48.65.89") self.assertEquals(["192.168.0.1", "129.168.0.2", "184.48.65.89"], appscale_info.get_taskqueue_nodes()) flexmock(file_io).should_receive("read").\ and_return("192.168.0.1\n129.168.0.2\n184.48.65.89\n") self.assertEquals(["192.168.0.1", "129.168.0.2", "184.48.65.89"], appscale_info.get_taskqueue_nodes()) flexmock(file_io).should_receive("read").and_return("") self.assertEquals(appscale_info.get_taskqueue_nodes(), [])
def test_get_taskqueue_nodes(self): flexmock(file_io).should_receive("mkdir").and_return(None) flexmock(file_io).should_receive("read").\ and_return("192.168.0.1\n129.168.0.2\n184.48.65.89") self.assertEquals(["192.168.0.1","129.168.0.2","184.48.65.89"], appscale_info.get_taskqueue_nodes()) flexmock(file_io).should_receive("read").\ and_return("192.168.0.1\n129.168.0.2\n184.48.65.89\n") self.assertEquals(["192.168.0.1","129.168.0.2","184.48.65.89"], appscale_info.get_taskqueue_nodes()) flexmock(file_io).should_receive("read").and_return("") self.assertEquals(appscale_info.get_taskqueue_nodes(), [])
def main(): """ Starts the AdminServer. """ logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) parser = argparse.ArgumentParser() parser.add_argument('-p', '--port', type=int, default=constants.DEFAULT_PORT, help='The port to listen on') parser.add_argument('-v', '--verbose', action='store_true', help='Output debug-level logging') args = parser.parse_args() if args.verbose: logging.getLogger().setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) options.define('login_ip', appscale_info.get_login_ip()) options.define('private_ip', appscale_info.get_private_ip()) acc = appscale_info.get_appcontroller_client() ua_client = UAClient(appscale_info.get_db_master_ip(), options.secret) zk_client = KazooClient(hosts=','.join(appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() version_update_lock = zk_client.Lock(constants.VERSION_UPDATE_LOCK_NODE) thread_pool = ThreadPoolExecutor(4) monit_operator = MonitOperator() all_resources = { 'acc': acc, 'ua_client': ua_client, 'zk_client': zk_client, 'version_update_lock': version_update_lock, 'thread_pool': thread_pool } if options.private_ip in appscale_info.get_taskqueue_nodes(): logging.info('Starting push worker manager') GlobalPushWorkerManager(zk_client, monit_operator) app = web.Application([ ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)/versions', VersionsHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)/versions/([a-z0-9-]+)', VersionHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/operations/([a-z0-9-]+)', OperationsHandler), ('/api/queue/update', UpdateQueuesHandler, { 'zk_client': zk_client }) ]) logging.info('Starting AdminServer') app.listen(args.port) io_loop = IOLoop.current() io_loop.start()
def main(): """ Main. """ parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='store_true', help='Output debug-level logging') args = parser.parse_args() logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) if args.verbose: logging.getLogger().setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) my_ip = appscale_info.get_private_ip() is_master = (my_ip == appscale_info.get_headnode_ip()) is_lb = (my_ip in appscale_info.get_load_balancer_ips()) is_tq = (my_ip in appscale_info.get_taskqueue_nodes()) is_db = (my_ip in appscale_info.get_db_ips()) if is_master: global zk_client zk_client = KazooClient(hosts=','.join( appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() # Start watching profiling configs in ZooKeeper stats_app.ProfilingManager(zk_client) app = tornado.web.Application( stats_app.get_local_stats_api_routes(is_lb, is_tq, is_db) + stats_app.get_cluster_stats_api_routes(is_master), debug=False) app.listen(constants.HERMES_PORT) # Start loop for accepting http requests. IOLoop.instance().start() logger.info("Hermes is up and listening on port: {}.".format( constants.HERMES_PORT))
def main(): """ Main. """ parser = argparse.ArgumentParser() parser.add_argument( '-v', '--verbose', action='store_true', help='Output debug-level logging') args = parser.parse_args() logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) if args.verbose: logging.getLogger().setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) my_ip = appscale_info.get_private_ip() is_master = (my_ip == appscale_info.get_headnode_ip()) is_lb = (my_ip in appscale_info.get_load_balancer_ips()) is_tq = (my_ip in appscale_info.get_taskqueue_nodes()) is_db = (my_ip in appscale_info.get_db_ips()) if is_master: global zk_client zk_client = KazooClient( hosts=','.join(appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() # Start watching profiling configs in ZooKeeper stats_app.ProfilingManager(zk_client) app = tornado.web.Application( stats_app.get_local_stats_api_routes(is_lb, is_tq, is_db) + stats_app.get_cluster_stats_api_routes(is_master), debug=False ) app.listen(constants.HERMES_PORT) # Start loop for accepting http requests. IOLoop.instance().start() logger.info("Hermes is up and listening on port: {}." .format(constants.HERMES_PORT))
def main(): """ Main. """ parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='store_true', help='Output debug-level logging') parser.add_argument('--port', type=int, default=constants.HERMES_PORT, help='The port to listen on') args = parser.parse_args() logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) if args.verbose: logging.getLogger('appscale').setLevel(logging.DEBUG) my_ip = appscale_info.get_private_ip() is_master = (my_ip == appscale_info.get_headnode_ip()) is_lb = (my_ip in appscale_info.get_load_balancer_ips()) is_tq = (my_ip in appscale_info.get_taskqueue_nodes()) is_db = (my_ip in appscale_info.get_db_ips()) app = web.Application(middlewares=[verify_secret_middleware]) route_items = [] route_items += get_local_stats_api_routes(is_lb, is_tq, is_db) route_items += get_cluster_stats_api_routes(is_master) for route, handler in route_items: app.router.add_get(route, handler) logger.info("Starting Hermes on port: {}.".format(args.port)) web.run_app(app, port=args.port, access_log=logger, access_log_format='%a "%r" %s %bB %Tfs "%{User-Agent}i"')
def main(): """ Starts the AdminServer. """ logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) parser = argparse.ArgumentParser( prog='appscale-admin', description='Manages AppScale-related processes') subparsers = parser.add_subparsers(dest='command') subparsers.required = True serve_parser = subparsers.add_parser( 'serve', description='Starts the server that manages AppScale processes') serve_parser.add_argument( '-p', '--port', type=int, default=constants.DEFAULT_PORT, help='The port to listen on') serve_parser.add_argument( '-v', '--verbose', action='store_true', help='Output debug-level logging') subparsers.add_parser( 'summary', description='Lists AppScale processes running on this machine') restart_parser = subparsers.add_parser( 'restart', description='Restart AppScale processes running on this machine') restart_parser.add_argument('service', nargs='+', help='The process or service ID to restart') args = parser.parse_args() if args.command == 'summary': table = sorted(list(get_combined_services().items())) print(tabulate(table, headers=['Service', 'State'])) sys.exit(0) if args.command == 'restart': socket_path = urlquote(ServiceManagerHandler.SOCKET_PATH, safe='') session = requests_unixsocket.Session() response = session.post( 'http+unix://{}/'.format(socket_path), data={'command': 'restart', 'arg': [args.service]}) response.raise_for_status() return if args.verbose: logger.setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) options.define('login_ip', appscale_info.get_login_ip()) options.define('private_ip', appscale_info.get_private_ip()) options.define('load_balancers', appscale_info.get_load_balancer_ips()) acc = appscale_info.get_appcontroller_client() ua_client = UAClient(appscale_info.get_db_master_ip(), options.secret) zk_client = KazooClient( hosts=','.join(appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() version_update_lock = zk_client.Lock(constants.VERSION_UPDATE_LOCK_NODE) thread_pool = ThreadPoolExecutor(4) monit_operator = MonitOperator() all_resources = { 'acc': acc, 'ua_client': ua_client, 'zk_client': zk_client, 'version_update_lock': version_update_lock, 'thread_pool': thread_pool } if options.private_ip in appscale_info.get_taskqueue_nodes(): logger.info('Starting push worker manager') GlobalPushWorkerManager(zk_client, monit_operator) service_manager = ServiceManager(zk_client) service_manager.start() app = web.Application([ ('/oauth/token', OAuthHandler, {'ua_client': ua_client}), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)/versions', VersionsHandler, {'ua_client': ua_client, 'zk_client': zk_client, 'version_update_lock': version_update_lock, 'thread_pool': thread_pool}), ('/v1/projects', ProjectsHandler, all_resources), ('/v1/projects/([a-z0-9-]+)', ProjectHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)', ServiceHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)/versions/([a-z0-9-]+)', VersionHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/operations/([a-z0-9-]+)', OperationsHandler, {'ua_client': ua_client}), ('/api/cron/update', UpdateCronHandler, {'acc': acc, 'zk_client': zk_client, 'ua_client': ua_client}), ('/api/datastore/index/add', UpdateIndexesHandler, {'zk_client': zk_client, 'ua_client': ua_client}), ('/api/queue/update', UpdateQueuesHandler, {'zk_client': zk_client, 'ua_client': ua_client}) ]) logger.info('Starting AdminServer') app.listen(args.port) management_app = web.Application([ ('/', ServiceManagerHandler, {'service_manager': service_manager})]) management_server = HTTPServer(management_app) management_socket = bind_unix_socket(ServiceManagerHandler.SOCKET_PATH) management_server.add_socket(management_socket) io_loop = IOLoop.current() io_loop.start()
def main(): """ Starts the AdminServer. """ logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) parser = argparse.ArgumentParser( prog='appscale-admin', description='Manages AppScale-related processes') subparsers = parser.add_subparsers(dest='command') subparsers.required = True serve_parser = subparsers.add_parser( 'serve', description='Starts the server that manages AppScale processes') serve_parser.add_argument( '-p', '--port', type=int, default=constants.DEFAULT_PORT, help='The port to listen on') serve_parser.add_argument( '-v', '--verbose', action='store_true', help='Output debug-level logging') subparsers.add_parser( 'summary', description='Lists AppScale processes running on this machine') args = parser.parse_args() if args.command == 'summary': table = sorted(list(get_combined_services().items())) print(tabulate(table, headers=['Service', 'State'])) sys.exit(0) if args.verbose: logger.setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) options.define('login_ip', appscale_info.get_login_ip()) options.define('private_ip', appscale_info.get_private_ip()) options.define('load_balancers', appscale_info.get_load_balancer_ips()) acc = appscale_info.get_appcontroller_client() ua_client = UAClient(appscale_info.get_db_master_ip(), options.secret) zk_client = KazooClient( hosts=','.join(appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() version_update_lock = zk_client.Lock(constants.VERSION_UPDATE_LOCK_NODE) thread_pool = ThreadPoolExecutor(4) monit_operator = MonitOperator() all_resources = { 'acc': acc, 'ua_client': ua_client, 'zk_client': zk_client, 'version_update_lock': version_update_lock, 'thread_pool': thread_pool } if options.private_ip in appscale_info.get_taskqueue_nodes(): logger.info('Starting push worker manager') GlobalPushWorkerManager(zk_client, monit_operator) service_manager = ServiceManager(zk_client) service_manager.start() app = web.Application([ ('/oauth/token', OAuthHandler, {'ua_client': ua_client}), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)/versions', VersionsHandler, all_resources), ('/v1/projects', ProjectsHandler, all_resources), ('/v1/projects/([a-z0-9-]+)', ProjectHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)', ServiceHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/services/([a-z0-9-]+)/versions/([a-z0-9-]+)', VersionHandler, all_resources), ('/v1/apps/([a-z0-9-]+)/operations/([a-z0-9-]+)', OperationsHandler, {'ua_client': ua_client}), ('/api/cron/update', UpdateCronHandler, {'acc': acc, 'zk_client': zk_client, 'ua_client': ua_client}), ('/api/queue/update', UpdateQueuesHandler, {'zk_client': zk_client, 'ua_client': ua_client}) ]) logger.info('Starting AdminServer') app.listen(args.port) io_loop = IOLoop.current() io_loop.start()
def main(): """ Main. """ parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='store_true', help='Output debug-level logging') args = parser.parse_args() logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) if args.verbose: logging.getLogger().setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) my_ip = appscale_info.get_private_ip() is_master = (my_ip == appscale_info.get_headnode_ip()) is_lb = (my_ip in appscale_info.get_load_balancer_ips()) is_tq = (my_ip in appscale_info.get_taskqueue_nodes()) if is_master: # Periodically check with the portal for new tasks. # Note: Currently, any active handlers from the tornado app will block # polling until they complete. PeriodicCallback(poll, constants.POLLING_INTERVAL).start() # Only master Hermes node handles /do_task route task_route = ('/do_task', TaskHandler) global zk_client zk_client = KazooClient(hosts=','.join( appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() # Start watching profiling configs in ZooKeeper stats_app.ProfilingManager(zk_client) # Periodically checks if the deployment is registered and uploads the # appscalesensor app for registered deployments. sensor_deployer = SensorDeployer(zk_client) PeriodicCallback(sensor_deployer.deploy, constants.UPLOAD_SENSOR_INTERVAL).start() else: task_route = ( '/do_task', Respond404Handler, dict(reason='Hermes slaves do not manage tasks from Portal')) app = tornado.web.Application( [ ("/", MainHandler), task_route, ] + stats_app.get_local_stats_api_routes(is_lb, is_tq) + stats_app.get_cluster_stats_api_routes(is_master), debug=False) app.listen(constants.HERMES_PORT) # Start loop for accepting http requests. IOLoop.instance().start() logging.info("Hermes is up and listening on port: {}.".format( constants.HERMES_PORT))
local_stats_source=process_stats.ProcessesStatsSource ) cluster_proxies_stats = ClusterStatsSource( ips_getter=appscale_info.get_load_balancer_ips, method_path='stats/local/proxies', stats_model=proxy_stats.ProxiesStatsSnapshot, local_stats_source=proxy_stats.ProxiesStatsSource ) cluster_taskqueue_stats = ClusterStatsSource( ips_getter=get_random_lb_node, method_path='stats/local/taskqueue', stats_model=taskqueue_stats.TaskqueueServiceStatsSnapshot, local_stats_source=taskqueue_stats.taskqueue_stats_source ) cluster_rabbitmq_stats = ClusterStatsSource( ips_getter=appscale_info.get_taskqueue_nodes, method_path='stats/local/rabbitmq', stats_model=rabbitmq_stats.RabbitMQStatsSnapshot, local_stats_source=rabbitmq_stats.RabbitMQStatsSource ) cluster_push_queues_stats = ClusterStatsSource( ips_getter=lambda: [appscale_info.get_taskqueue_nodes()[0]], method_path='stats/local/push_queues', stats_model=rabbitmq_stats.PushQueueStatsSnapshot, local_stats_source=rabbitmq_stats.PushQueueStatsSource )
class ClusterPushQueueStatsSource(ClusterStatsSource): ips_getter = staticmethod(lambda: [appscale_info.get_taskqueue_nodes()[0]]) method_path = 'stats/local/push_queues' stats_model = rabbitmq_stats.PushQueueStatsSnapshot local_stats_source = rabbitmq_stats.PushQueueStatsSource
cluster_proxies_stats = ClusterStatsSource( ips_getter=appscale_info.get_load_balancer_ips, method_path='stats/local/proxies', stats_model=proxy_stats.ProxiesStatsSnapshot, local_stats_source=proxy_stats.ProxiesStatsSource) cluster_taskqueue_stats = ClusterStatsSource( ips_getter=get_random_lb_node, method_path='stats/local/taskqueue', stats_model=taskqueue_stats.TaskqueueServiceStatsSnapshot, local_stats_source=taskqueue_stats.taskqueue_stats_source) cluster_rabbitmq_stats = ClusterStatsSource( ips_getter=appscale_info.get_taskqueue_nodes, method_path='stats/local/rabbitmq', stats_model=rabbitmq_stats.RabbitMQStatsSnapshot, local_stats_source=rabbitmq_stats.RabbitMQStatsSource) cluster_push_queues_stats = ClusterStatsSource( ips_getter=lambda: [appscale_info.get_taskqueue_nodes()[0]], method_path='stats/local/push_queues', stats_model=rabbitmq_stats.PushQueueStatsSnapshot, local_stats_source=rabbitmq_stats.PushQueueStatsSource) cluster_cassandra_stats = ClusterStatsSource( ips_getter=get_random_db_node, method_path='stats/local/cassandra', stats_model=cassandra_stats.CassandraStatsSnapshot, local_stats_source=cassandra_stats.CassandraStatsSource)
def main(): """ Main. """ parser = argparse.ArgumentParser() parser.add_argument( '-v', '--verbose', action='store_true', help='Output debug-level logging') args = parser.parse_args() logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) if args.verbose: logging.getLogger().setLevel(logging.DEBUG) options.define('secret', appscale_info.get_secret()) signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) my_ip = appscale_info.get_private_ip() is_master = (my_ip == appscale_info.get_headnode_ip()) is_lb = (my_ip in appscale_info.get_load_balancer_ips()) is_tq = (my_ip in appscale_info.get_taskqueue_nodes()) if is_master: # Periodically check with the portal for new tasks. # Note: Currently, any active handlers from the tornado app will block # polling until they complete. PeriodicCallback(poll, constants.POLLING_INTERVAL).start() # Only master Hermes node handles /do_task route task_route = ('/do_task', TaskHandler) global zk_client zk_client = KazooClient( hosts=','.join(appscale_info.get_zk_node_ips()), connection_retry=ZK_PERSISTENT_RECONNECTS) zk_client.start() # Start watching profiling configs in ZooKeeper stats_app.ProfilingManager(zk_client) # Periodically checks if the deployment is registered and uploads the # appscalesensor app for registered deployments. sensor_deployer = SensorDeployer(zk_client) PeriodicCallback(sensor_deployer.deploy, constants.UPLOAD_SENSOR_INTERVAL).start() else: task_route = ('/do_task', Respond404Handler, dict(reason='Hermes slaves do not manage tasks from Portal')) app = tornado.web.Application([ ("/", MainHandler), task_route, ] + stats_app.get_local_stats_api_routes(is_lb, is_tq) + stats_app.get_cluster_stats_api_routes(is_master), debug=False ) app.listen(constants.HERMES_PORT) # Start loop for accepting http requests. IOLoop.instance().start() logging.info("Hermes is up and listening on port: {}." .format(constants.HERMES_PORT))