all repos — janny @ ec88575db2d8915a34cc523c2e2f01af6575ee4f

clean up Kubernetes resources after a set TTL

janny/cleanup.py (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
import time
import json
import datetime
from types import SimpleNamespace

from janny.utils import parse_delta, RUNNING
from janny.auth import SESSION as s
from janny.config import API_HOST, logger


def clean_up(
    url: str, resource_obj: SimpleNamespace, object_name: str, kill_time: str, namespace: str
):
    """
    Parse the kill_time and create call send_delete_request(); create an event after deletion.
    """
    delta = parse_delta(kill_time)
    secs = delta.total_seconds()
    time.sleep(secs)
    logger.info(f"Slept for {kill_time}, cleaning resource {object_name} now")
    send_delete_request(url, resource_obj.name, object_name, namespace)

    message = f"Successfully deleted {resource_obj.name}/{object_name}"
    now = datetime.datetime.utcnow().isoformat() + "Z"
    event = {
        "metadata": {
            "namespace": namespace,
            "generateName": "janny-",
        },
        "type": "Normal",
        "count": 1,
        "action": f"Deleted resource {object_name}",
        "eventTime": now,
        "firstTimestamp": now,
        "reason": "ResourceDeleted",
        "message": message,
        "involvedObject": {
            "apiVersion": "v1",
            "name": object_name,
            "namespace": namespace,
            "kind": resource_obj.kind,
        },
        "reportingComponent": "janny",
        "reportingInstance": "janny",
        "source": {
            "component": "janny",
        },
    }

    create_event(event, namespace)


def send_delete_request(
    url: str, kube_resource: str, resource_name: str, namespace: str
):
    """
    Sends a DELETE request to the resource.
    """
    api_url = f"{API_HOST}{url}/namespaces/{namespace}/{kube_resource}/{resource_name}"
    response = s.delete(api_url, params={"propagationPolicy": "Background"})
    logger.info(f"Sent delete request to {kube_resource}/{resource_name}")
    response_json = json.loads(response.content)
    if "Success" not in response_json.values():
        logger.error(f"Deletion failed! Recieved: {response_json}")

    RUNNING.remove(resource_name)


def create_event(event: dict, namespace: str):
    """
    Create an Event for resource deletion.
    FIXME: Maybe don't hardcode the group URL?
    """

    api_url = f"{API_HOST}/api/v1/namespaces/{namespace}/events"
    response = s.post(api_url, json=event)
    response_json = json.loads(response.content)
    if "Failure" not in response_json.values():
        logger.info(f"Created event")
    else:
        logger.error(f"Failed to create event! Recieved: {response_json}")