Files
Django_kube/django_code/apps/cloudmanager/utils.py
T
pierre.geeraert 860de928ba
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
verbose everywhere
2026-09-09 14:25:05 +01:00

122 lines
6.8 KiB
Python

import datetime
from apps.kubernetes_connection.utils import get_namespace,get_deployments,scale_up,scale_down
from apps.cloudmanager.models import Schedule_Day_Data,Schedule_Week_Data,Namespace_Data,Deployment_Data
def import_namespace():
namespaces_list = get_namespace()
for namespace in namespaces_list:
if namespace[0]!="kube-system":
Namespace_Data.objects.get_or_create(namespace=namespace)
def import_deployment():
deployment_list = get_deployments()
Schedule_Day_Always_off,Schedule_Day_Always_on = generate_default_day_schedule()
Schedule_Week_Always_off,Schedule_Week_Always_on = generate_default_week_schedule()
for deployment in deployment_list:
if deployment[0]!="kube-system":
Deployment_Data.objects.get_or_create(namespace=deployment[0],name=deployment[1],defaults={"replicas":deployment[2],"actual_replica":deployment[2],"schedule_day":Schedule_Day_Always_on,"schedule_week":Schedule_Week_Always_on})
def generate_default_day_schedule():
Always_off,status = Schedule_Day_Data.objects.update_or_create(name_schedule="Always_off",defaults={"state_at_0" : False ,"state_at_1" : False ,"state_at_2" : False ,"state_at_3" : False ,"state_at_4" : False ,"state_at_5" : False ,"state_at_6" : False ,"state_at_7" : False ,"state_at_8" : False ,"state_at_9" : False ,"state_at_10" : False ,"state_at_11" : False ,"state_at_12" : False ,"state_at_13" : False ,"state_at_14" : False ,"state_at_15" : False ,"state_at_16" : False ,"state_at_17" : False ,"state_at_18" : False ,"state_at_19" : False ,"state_at_20" : False ,"state_at_21" : False ,"state_at_22" : False ,"state_at_23" : False})
Always_on,status = Schedule_Day_Data.objects.update_or_create(name_schedule="Always_on",defaults={"state_at_0" : True ,"state_at_1" : True ,"state_at_2" : True ,"state_at_3" : True ,"state_at_4" : True ,"state_at_5" : True ,"state_at_6" : True ,"state_at_7" : True ,"state_at_8" : True ,"state_at_9" : True ,"state_at_10" : True ,"state_at_11" : True ,"state_at_12" : True ,"state_at_13" : True ,"state_at_14" : True ,"state_at_15" : True ,"state_at_16" : True ,"state_at_17" : True ,"state_at_18" : True ,"state_at_19" : True ,"state_at_20" : True ,"state_at_21" : True ,"state_at_22" : True ,"state_at_23" : True})
return Always_off,Always_on
def generate_default_week_schedule():
Always_off,status = Schedule_Week_Data.objects.update_or_create(name_schedule="Always_off",defaults={"state_Monday" : False , "state_Tuesday" : False , "state_Wednesday" : False , "state_Thursday" : False , "state_Friday" : False , "state_Saturday" : False , "state_Sunday" : False})
Always_on,status = Schedule_Week_Data.objects.update_or_create(name_schedule="Always_on",defaults={"state_Monday" : True , "state_Tuesday" : True , "state_Wednesday" : True , "state_Thursday" : True , "state_Friday" : True , "state_Saturday" : True , "state_Sunday" : True})
return Always_off,Always_on
def Give_current_weekday():
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday', 'Sunday']
weekday = days[datetime.datetime.today().weekday()]
return weekday
def Give_current_hour():
now = datetime.datetime.now()
return now.hour
def get_current_replicas():
deployments_list = get_deployments()
for deployment in deployments_list:
if deployment[0]!="kube-system":
object,created = Deployment_Data.objects.update_or_create(namespace=deployment[0],name=deployment[1],defaults={"actual_replica":deployment[2]})
if created:
print("THIS DEPLOY: name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2])+" IS NEW !!!!!")
return 0
def Check_server_supposed_XXX(expected_status,verbose=False):
#just for testing
#expected_status = True
# Get week schedule
argument_week="state_"+str(Give_current_weekday())
query_week = {argument_week : expected_status}
schedules_week = Schedule_Week_Data.objects.filter(**query_week)
# Get day schedule
argument_day="state_at_"+str(Give_current_hour())
query_day = {argument_day : expected_status}
schedules_day = Schedule_Day_Data.objects.filter(**query_day)
if expected_status:
deployments = Deployment_Data.objects.filter(schedule_week__in=schedules_week, schedule_day__in=schedules_day)
else:
deployments = Deployment_Data.objects.filter(schedule_week__in=schedules_week) | Deployment_Data.objects.filter(schedule_day__in=schedules_day)
deployments_list = []
for deployment in deployments:
display_list = []
name = deployment.name
display_list.append(name)
if verbose : print("name: "+str(name))
namespace = deployment.namespace
display_list.append(namespace)
if verbose : print("namespace: "+str(namespace))
replicas = deployment.replicas
display_list.append(replicas)
if verbose : print("replicas: "+str(replicas))
#Adding the whole object as well for future use
display_list.append(deployment)
deployments_list.append(display_list)
return deployments_list
def retrieve_and_apply():
#Get current replica to compare with the replicas created at the start
get_current_replicas()
print("------------------------------------------")
print("-----------------UP-----------------------")
print("------------------------------------------")
servers_supposed_true = Check_server_supposed_XXX(True)
for server in servers_supposed_true:
#check if the expected replica (server[2]) match the current replica of the deployment (server[3].actual_replica)
if server[3].actual_replica == server[2]:
print("name: "+str(server[1])+" namespace: "+str(server[0])+" already good")
else:
print("Starting -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2]))
scale_up(namespace_name=server[1],deploy_name=server[0],replicas=server[2])
print("------------------------------------------")
print("----------------DOWN----------------------")
print("------------------------------------------")
servers_supposed_false = Check_server_supposed_XXX(False)
for server in servers_supposed_false:
#check if the current replica of the deployment (server[3].actual_replica) is already 0 meaning the server is already down
if server[3].actual_replica == 0:
print("name: "+str(server[1])+" namespace: "+str(server[0])+" already down")
else:
print("Shutting down -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2]))
scale_down(namespace_name=server[1],deploy_name=server[0])