Parsear MaintenanceWindow de RDS en Python

Para una aplicación que estamos desarrollando, necesitábamos saber cuándo se van a aplicar los mantenimientos en nuestras instancias de RDS. El problema es que según la documentación de Boto3, el método describe_pending_maintenance_actions devuelve la fecha de aplicación de la actualización en el campo CurrentApplyDate, pero esto siempre viene vacío:

$ aws rds describe-pending-maintenance-actions

El apaño que hemos hecho, es que cuando detectamos que una instancia de RDS tiene una operación de mantenimiento pendiente, obtenemos la fecha a partir del campo PreferredMaintenanceWindow de la propia instancia.

from pprint import pprint
from datetime import datetime, timedelta

def parse_rds_maintenance(maintenance_str: str):

    if not maintenance_str:
        return None, None

    start_str, end_str = maintenance_str.split("-")

    start_day, start_hour, start_minute = start_str.split(":")
    end_day, end_hour, end_minute = end_str.split(":")

    start = get_next_date_for(start_day, start_hour, start_minute)
    end = get_next_date_for(end_day, end_hour, end_minute)

    return start, end


def get_next_date_for(day, hour, minute):

    days_mappings = {
        "mon": 1,
        "tue": 2,
        "wed": 3,
        "thu": 4,
        "fri": 5,
        "sat": 6,
        "sun": 7,
    }

    now = datetime.utcnow()

    day_int = days_mappings.get(day)
    add_days = 0
    if now.isoweekday() < day_int:
        add_days = day_int - now.isoweekday()
    elif now.isoweekday() > day_int:
        add_days = 7 + day_int - now.isoweekday()

    date = (now + timedelta(days=add_days)).replace(hour=int(hour), minute=int(minute), second=0, microsecond=0)
    if date < now:
        date = date + timedelta(days=7)

    return date

if __name__ == '__main__':

    pprint(parse_rds_maintenance("tue:07:00-tue:07:30"))

Y esto devuelve (depende de la fecha en la que se ejecute, claro…):

(datetime.datetime(2019, 5, 21, 7, 0), datetime.datetime(2019, 5, 21, 7, 30))
comments powered by Disqus