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 the replicas is originally 0 , it means it is disabled so put the schedule as always off if deployment[2] == 0: schedule_object = Schedule_Day_Always_off else: schedule_object = Schedule_Day_Always_on 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_object,"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(verbose=False): output = "" output += Give_current_hour() output += "\n" #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]: if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already UP") else: echo = "Starting -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2]) output += echo output =+ "\n" print(echo) 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: if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already DOWN") else: echo = "Shutting down -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2]) output += echo output =+ "\n" print(echo) scale_down(namespace_name=server[1],deploy_name=server[0]) return output