def on_cloud_event(message): logger.debug(message) logger.debug(Haproxy.cls_linked_services) try: event = json.loads(message) except ValueError: logger.info("event is not a valid json message") return # When service scale up/down or container start/stop/terminate/redeploy, reload the service if event.get("state", "") not in ["In progress", "Pending", "Terminating", "Starting", "Scaling", "Stopping"] and \ event.get("type", "").lower() in ["container", "service"] and \ len(Haproxy.cls_linked_services.intersection(set(event.get("parents", [])))) > 0: msg = "Docker Cloud Event: %s %s is %s" % ( event["type"], get_uuid_from_resource_uri(event.get("resource_uri", "")), event["state"].lower()) add_haproxy_run_task(msg) # Add/remove services linked to haproxy if event.get("state", "") == "Success" and config.HAPROXY_SERVICE_URI in event.get( "parents", []): add_haproxy_run_task( "Docker Cloud Event: New action is executed on the Haproxy container" )
def listen_docker_events_compose_mode(): while True: try: try: docker = docker_client() except: docker = docker_client(os.environ) docker.ping() for event in docker.events(decode=True): logger.debug(event) attr = event.get("Actor", {}).get("Attributes", {}) compose_project = attr.get("com.docker.compose.project", "") compose_service = attr.get("com.docker.compose.service", "") container_name = attr.get("name", "") event_action = event.get("Action", "") service = "%s_%s" % (compose_project, compose_service) if service in Haproxy.cls_linked_services and event_action in ["start", "die"]: msg = "Docker event: container %s %s" % (container_name, event_action) add_haproxy_run_task(msg) except APIError as e: logger.info("Docker API error: %s" % e) time.sleep(1) add_haproxy_run_task("Reconnect docker events")
def polling_service_status_swarm_mode(): while True: time.sleep(config.SWARM_MODE_POLLING_INTERVAL) try: try: docker = docker_client() except: docker = docker_client(os.environ) tasks = docker.tasks(filters={"desired-state": "running"}) linked_tasks = set() for task in tasks: task_nets = [ network.get("Network", {}).get("ID", "") for network in task.get("NetworksAttachments", []) ] task_service_id = task.get("ServiceID", "") if task_service_id != Haproxy.cls_service_id and Haproxy.cls_nets.intersection( set(task_nets)): task_id = task.get("ID", "") linked_tasks.add(task_id) if Haproxy.cls_linked_tasks != linked_tasks: add_haproxy_run_task("Tasks are updated") except APIError as e: logger.info("Docker API error: %s" % e)
def main(): logging.basicConfig(stream=sys.stdout) logging.getLogger("haproxy").setLevel(logging.DEBUG if DEBUG else logging.INFO) if DEBUG: logging.getLogger("python-dockercloud").setLevel(logging.DEBUG) config.RUNNING_MODE = check_running_mode(HAPROXY_CONTAINER_URI, HAPROXY_SERVICE_URI, API_AUTH) gevent.signal(signal.SIGUSR1, on_user_reload) gevent.signal(signal.SIGTERM, sys.exit) gevent.spawn(run_haproxy) pid = create_pid_file() logger.info("dockercloud/haproxy PID: %s" % pid) if config.RUNNING_MODE == RunningMode.CloudMode: gevent.spawn(listen_dockercloud_events) elif config.RUNNING_MODE == RunningMode.ComposeMode: add_haproxy_run_task("Initial start - Compose Mode") gevent.spawn(listen_docker_events_compose_mode) elif config.RUNNING_MODE == RunningMode.SwarmMode: add_haproxy_run_task("Initial start - Swarm Mode") gevent.spawn(polling_service_status_swarm_mode) elif config.RUNNING_MODE == RunningMode.LegacyMode: add_haproxy_run_task("Initial start - Legacy Mode") while True: time.sleep(5) if Haproxy.cls_process: if is_process_running(Haproxy.cls_process): continue Haproxy.cls_cfg = None add_haproxy_run_task("haproxy %s died , restart" % Haproxy.cls_process.pid)
def polling_service_status_swarm_mode(): while True: time.sleep(config.SWARM_MODE_POLLING_INTERVAL) try: swarm = Client(base_url = os.environ.get('DOCKER_MANAGER_URI')) services = swarm.services() tasks = swarm.tasks(filters={"desired-state": "running"}) _, linked_tasks = SwarmModeLinkHelper.get_task_links(tasks, services, Haproxy.cls_service_id, Haproxy.cls_nets) if cmp(Haproxy.cls_linked_tasks, linked_tasks) != 0: add_haproxy_run_task("Tasks are updated") except ConnectionError as e: logger.info("Generic connection error: %s" % e) except APIError as e: logger.info("Docker API error: %s" % e)
def polling_service_status_swarm_mode(): while True: time.sleep(config.SWARM_MODE_POLLING_INTERVAL) try: try: docker = docker_client() except: docker = docker_client(os.environ) services = docker.services() tasks = docker.tasks(filters={"desired-state": "running"}) _, linked_tasks = SwarmModeLinkHelper.get_task_links(tasks, services, Haproxy.cls_service_id, Haproxy.cls_nets) if cmp(Haproxy.cls_linked_tasks, linked_tasks) != 0: add_haproxy_run_task("Tasks are updated") except APIError as e: logger.info("Docker API error: %s" % e)
def polling_service_status_swarm_mode(): while True: time.sleep(config.SWARM_MODE_POLLING_INTERVAL) try: try: docker = docker_client() except: docker = docker_client(os.environ) services = docker.services() tasks = docker.tasks(filters={"desired-state": "running"}) _, linked_tasks = SwarmModeLinkHelper.get_task_links( tasks, services, Haproxy.cls_service_id, Haproxy.cls_nets) if cmp(Haproxy.cls_linked_tasks, linked_tasks) != 0: add_haproxy_run_task("Tasks are updated") except APIError as e: logger.info("Docker API error: %s" % e)
def on_cloud_event(message): logger.debug(message) logger.debug(Haproxy.cls_linked_services) try: event = json.loads(message) except ValueError: logger.info("event is not a valid json message") return # When service scale up/down or container start/stop/terminate/redeploy, reload the service if event.get("state", "") not in ["In progress", "Pending", "Terminating", "Starting", "Scaling", "Stopping"] and \ event.get("type", "").lower() in ["container", "service"] and \ len(Haproxy.cls_linked_services.intersection(set(event.get("parents", [])))) > 0: msg = "Docker Cloud Event: %s %s is %s" % ( event["type"], get_uuid_from_resource_uri(event.get("resource_uri", "")), event["state"].lower()) add_haproxy_run_task(msg) # Add/remove services linked to haproxy if event.get("state", "") == "Success" and config.HAPROXY_SERVICE_URI in event.get("parents", []): add_haproxy_run_task("Docker Cloud Event: New action is executed on the Haproxy container")
def main(): logging.basicConfig(stream=sys.stdout) logging.getLogger("haproxy").setLevel( logging.DEBUG if DEBUG else logging.INFO) if DEBUG: logging.getLogger("python-dockercloud").setLevel(logging.DEBUG) config.RUNNING_MODE = check_running_mode(HAPROXY_CONTAINER_URI, HAPROXY_SERVICE_URI, API_AUTH) gevent.signal(signal.SIGUSR1, on_user_reload) gevent.signal(signal.SIGTERM, sys.exit) gevent.spawn(run_haproxy) pid = create_pid_file() logger.info("dockercloud/haproxy PID: %s" % pid) if config.RUNNING_MODE == RunningMode.CloudMode: gevent.spawn(listen_dockercloud_events) elif config.RUNNING_MODE == RunningMode.ComposeLinkMode: add_haproxy_run_task("Initial start - Compose Link Mode") gevent.spawn(listen_docker_events_compose_mode) elif config.RUNNING_MODE == RunningMode.ComposeNetworkMode: add_haproxy_run_task("Initial start - Compose Network Mode") gevent.spawn(listen_docker_events_compose_mode) elif config.RUNNING_MODE == RunningMode.SwarmMode: add_haproxy_run_task("Initial start - Swarm Mode") gevent.spawn(polling_service_status_swarm_mode) elif config.RUNNING_MODE == RunningMode.LegacyMode: add_haproxy_run_task("Initial start - Legacy Mode") while True: time.sleep(5) if Haproxy.cls_process: if is_process_running(Haproxy.cls_process): continue Haproxy.cls_cfg = None add_haproxy_run_task("haproxy %s died , restart" % Haproxy.cls_process.pid)
def polling_service_status_swarm_mode(): while True: time.sleep(config.SWARM_MODE_POLLING_INTERVAL) try: try: docker = docker_client() except: docker = docker_client(os.environ) tasks = docker.tasks(filters={"desired-state": "running"}) linked_tasks = set() for task in tasks: task_nets = [network.get("Network", {}).get("ID", "") for network in task.get("NetworksAttachments", [])] task_service_id = task.get("ServiceID", "") if task_service_id != Haproxy.cls_service_id and Haproxy.cls_nets.intersection(set(task_nets)): task_id = task.get("ID", "") linked_tasks.add(task_id) if Haproxy.cls_linked_tasks != linked_tasks: add_haproxy_run_task("Tasks are updated") except APIError as e: logger.info("Docker API error: %s" % e)
def on_user_reload(): Haproxy.cls_cfg = None add_haproxy_run_task("User reload")
def on_websocket_open(): helper.cloud_mode_link_helper.LINKED_CONTAINER_CACHE.clear() add_haproxy_run_task("Websocket open")