122 lines
6.8 KiB
Python
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])
|