Parsear MaintenanceWindow de RDS en Python
Publicado: 2019-05-20
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))