Esempio n. 1
0
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"
        )
Esempio n. 2
0
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 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")
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 8
0
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")
Esempio n. 10
0
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)
Esempio n. 11
0
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)
Esempio n. 12
0
def on_user_reload():
    Haproxy.cls_cfg = None
    add_haproxy_run_task("User reload")
Esempio n. 13
0
def on_websocket_open():
    helper.cloud_mode_link_helper.LINKED_CONTAINER_CACHE.clear()
    add_haproxy_run_task("Websocket open")
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")