|
| 1 | +import json |
| 2 | + |
| 3 | +import arrow |
| 4 | +import requests |
| 5 | +from monitor_release.models import RunningSidecar |
| 6 | +from monitor_release.settings import Settings |
| 7 | + |
| 8 | + |
| 9 | +def get_bearer_token(settings: Settings): |
| 10 | + headers = {"accept": "application/json", "Content-Type": "application/json"} |
| 11 | + payload = json.dumps( |
| 12 | + { |
| 13 | + "Username": settings.portainer_username, |
| 14 | + "Password": settings.portainer_password, |
| 15 | + } |
| 16 | + ) |
| 17 | + response = requests.post( |
| 18 | + f"{settings.portainer_url}/portainer/api/auth", |
| 19 | + headers=headers, |
| 20 | + data=payload, |
| 21 | + ) |
| 22 | + bearer_token = response.json()["jwt"] |
| 23 | + return bearer_token |
| 24 | + |
| 25 | + |
| 26 | +def get_services(settings: Settings, bearer_token): |
| 27 | + services_url = f"{settings.portainer_url}/portainer/api/endpoints/{settings.portainer_endpoint_version}/docker/services" |
| 28 | + response = requests.get( |
| 29 | + services_url, |
| 30 | + headers={ |
| 31 | + "Authorization": "Bearer " + bearer_token, |
| 32 | + "Content-Type": "application/json", |
| 33 | + }, |
| 34 | + ) |
| 35 | + services = response.json() |
| 36 | + return services |
| 37 | + |
| 38 | + |
| 39 | +def get_tasks(settings: Settings, bearer_token): |
| 40 | + tasks_url = f"{settings.portainer_url}/portainer/api/endpoints/{settings.portainer_endpoint_version}/docker/tasks" |
| 41 | + response = requests.get( |
| 42 | + tasks_url, |
| 43 | + headers={ |
| 44 | + "Authorization": "Bearer " + bearer_token, |
| 45 | + "Content-Type": "application/json", |
| 46 | + }, |
| 47 | + ) |
| 48 | + tasks = response.json() |
| 49 | + return tasks |
| 50 | + |
| 51 | + |
| 52 | +def get_containers(settings: Settings, bearer_token): |
| 53 | + bearer_token = get_bearer_token(settings) |
| 54 | + |
| 55 | + containers_url = f"{settings.portainer_url}/portainer/api/endpoints/{settings.portainer_endpoint_version}/docker/containers/json?all=true" |
| 56 | + response = requests.get( |
| 57 | + containers_url, |
| 58 | + headers={ |
| 59 | + "Authorization": "Bearer " + bearer_token, |
| 60 | + "Content-Type": "application/json", |
| 61 | + }, |
| 62 | + ) |
| 63 | + containers = response.json() |
| 64 | + return containers |
| 65 | + |
| 66 | + |
| 67 | +def check_simcore_running_sidecars(settings: Settings, services): |
| 68 | + running_sidecars: list[RunningSidecar] = [] |
| 69 | + for service in services: |
| 70 | + if ( |
| 71 | + service["Spec"]["Name"].startswith("dy-sidecar") |
| 72 | + and service["Spec"]["Labels"]["io.simcore.runtime.swarm-stack-name"] |
| 73 | + == settings.swarm_stack_name |
| 74 | + ): |
| 75 | + running_sidecars.append( |
| 76 | + RunningSidecar( |
| 77 | + name=service["Spec"]["Name"], |
| 78 | + created_at=arrow.get(service["CreatedAt"]).datetime, |
| 79 | + user_id=service["Spec"]["Labels"]["io.simcore.runtime.user-id"], |
| 80 | + project_id=service["Spec"]["Labels"][ |
| 81 | + "io.simcore.runtime.project-id" |
| 82 | + ], |
| 83 | + service_key=service["Spec"]["Labels"][ |
| 84 | + "io.simcore.runtime.service-key" |
| 85 | + ], |
| 86 | + service_version=service["Spec"]["Labels"][ |
| 87 | + "io.simcore.runtime.service-version" |
| 88 | + ], |
| 89 | + ) |
| 90 | + ) |
| 91 | + return running_sidecars |
| 92 | + |
| 93 | + |
| 94 | +def _generate_containers_map(containers): |
| 95 | + container_map = {} |
| 96 | + for container in containers: |
| 97 | + git_sha = ( |
| 98 | + container.get("Labels").get("org.opencontainers.image.revision") |
| 99 | + if container.get("Labels").get( |
| 100 | + "org.opencontainers.image.revision" |
| 101 | + ) # container.get("Labels").get("org.label-schema.vcs-ref") |
| 102 | + else container.get("Labels").get("org.label-schema.vcs-ref") |
| 103 | + ) |
| 104 | + |
| 105 | + container_map[container["Id"]] = {"git_sha": git_sha} |
| 106 | + return container_map |
| 107 | + |
| 108 | + |
| 109 | +def check_simcore_deployed_services(settings: Settings, services, tasks, containers): |
| 110 | + container_map = _generate_containers_map(containers) |
| 111 | + service_task_map = {} |
| 112 | + for service in services: |
| 113 | + if service["Spec"]["Name"].startswith(settings.starts_with): |
| 114 | + service_task_map[service["ID"]] = { |
| 115 | + "service_name": service["Spec"]["Name"], |
| 116 | + "tasks": [], |
| 117 | + } |
| 118 | + |
| 119 | + for task in tasks: |
| 120 | + if task["ServiceID"] in service_task_map: |
| 121 | + if task["Status"].get("ContainerStatus") is None: |
| 122 | + continue |
| 123 | + container_id = task["Status"]["ContainerStatus"]["ContainerID"] |
| 124 | + |
| 125 | + service_task_map[task["ServiceID"]]["tasks"].append( |
| 126 | + { |
| 127 | + "created_at": arrow.get(task["CreatedAt"]).datetime, |
| 128 | + "status": task["Status"]["State"], |
| 129 | + "timestamp": arrow.get(task["Status"]["Timestamp"]).datetime, |
| 130 | + "git_sha": container_map.get(container_id, {}).get("git_sha"), |
| 131 | + } |
| 132 | + ) |
| 133 | + |
| 134 | + return service_task_map |
0 commit comments