diff --git a/django_code/apps/cloudmanager/admin.py b/django_code/apps/cloudmanager/admin.py index 1ef5a86..bb6b80e 100644 --- a/django_code/apps/cloudmanager/admin.py +++ b/django_code/apps/cloudmanager/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin,messages from django.utils.translation import ngettext -from .models import Deployment_Data,Schedule_Day_Data,Schedule_Week_Data,Namespace_Data,namespace_cmm_data_object -from .utils import import_namespace +from .models import Deployment_Data,Schedule_Day_Data,Schedule_Week_Data,Namespace_Data +from .utils import import_namespace,import_deployment,generate_default_day_schedule,generate_default_week_schedule,Check_server_supposed_XXX from apps.kubernetes_connection.utils import scale_up,scale_down DB = 'cloudmanager_db' @@ -38,22 +38,33 @@ def scale_down_deploy(modeladmin, request, queryset): messages.SUCCESS, ) -@admin.action(description="create_entry") -def create_entry(modeladmin, request, queryset): - print("simpsons_data_object.create(season=2, episode=3, url='google.com'', seen=True)") - #call function to trigger refresh of all deploy +@admin.action(description="Expected False") +def Check_server_supposed_False(modeladmin, request, queryset): + servers_supposed_false = Check_server_supposed_XXX(False) + for server in servers_supposed_false: + messages.add_message(request, messages.INFO, server) +@admin.action(description="Expected True") +def Check_server_supposed_true(modeladmin, request, queryset): + servers_supposed_false = Check_server_supposed_XXX(True) + for server in servers_supposed_false: + messages.add_message(request, messages.INFO, server) + +@admin.action(description="create default schedule") +def generate_default_day_schedule_admin(modeladmin, request, queryset): + generate_default_day_schedule() + generate_default_week_schedule() + + @admin.action(description="import namespace") def import_namespace_admin(modeladmin, request, queryset): - # - # - # - # don't forgot to clear thge quyeryset before running this - # - import_namespace(namespace_cmm_data_object) - print("simpsons_data_object.create(season=2, episode=3, url='google.com'', seen=True)") - #call function to trigger refresh of all deploy + import_namespace() +@admin.action(description="import deployment") +def import_deployment_admin(modeladmin, request, queryset): + import_deployment() + + class ActiveAtHourFilter(admin.SimpleListFilter): title = 'Active at hour' @@ -90,13 +101,13 @@ class MultiDBModelAdmin(admin.ModelAdmin): class DeploymentDataAdmin(MultiDBModelAdmin): list_display = ('name', 'namespace', 'schedule_week', 'schedule_day', 'replicas') list_filter = (ActiveAtHourFilter,) - actions = [scale_up_deploy,scale_down_deploy] + actions = [Check_server_supposed_False,Check_server_supposed_true,scale_up_deploy,scale_down_deploy,import_deployment_admin,generate_default_day_schedule_admin] @admin.register(Schedule_Day_Data) class ScheduleDayAdmin(MultiDBModelAdmin): list_display = ['name_schedule'] + [f'state_at_{h}' for h in range(24)] - + actions = [import_deployment_admin,generate_default_day_schedule_admin] @admin.register(Schedule_Week_Data) class ScheduleWeekAdmin(MultiDBModelAdmin): @@ -105,7 +116,8 @@ class ScheduleWeekAdmin(MultiDBModelAdmin): 'state_Monday', 'state_Tuesday', 'state_Wednesday', 'state_Thursday', 'state_Friday', 'state_Saturday', 'state_Sunday', ) - + actions = [import_deployment_admin,generate_default_day_schedule_admin] + @admin.register(Namespace_Data) class NamespaceAdmin(MultiDBModelAdmin): list_display = ('namespace',) diff --git a/django_code/apps/cloudmanager/migrations/0002_deployment_data_actual_replica.py b/django_code/apps/cloudmanager/migrations/0002_deployment_data_actual_replica.py new file mode 100644 index 0000000..fb3f57d --- /dev/null +++ b/django_code/apps/cloudmanager/migrations/0002_deployment_data_actual_replica.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.30 on 2026-09-09 12:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloudmanager', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='deployment_data', + name='actual_replica', + field=models.IntegerField(default=1), + preserve_default=False, + ), + ] diff --git a/django_code/apps/cloudmanager/models.py b/django_code/apps/cloudmanager/models.py index 032a558..3a05b3f 100644 --- a/django_code/apps/cloudmanager/models.py +++ b/django_code/apps/cloudmanager/models.py @@ -2,6 +2,7 @@ from django.db import models + class Schedule_Week_Data(models.Model): name_schedule = models.CharField(max_length=100,unique=True) state_Monday = models.BooleanField() @@ -53,6 +54,7 @@ class Deployment_Data(models.Model): schedule_week = models.ForeignKey(Schedule_Week_Data,null=True, blank=True, on_delete=models.SET_NULL) schedule_day = models.ForeignKey(Schedule_Day_Data,null=True, blank=True, on_delete=models.SET_NULL) replicas = models.IntegerField() + actual_replica = models.IntegerField() class Meta: db_table = 'machine' @@ -61,5 +63,3 @@ class Namespace_Data(models.Model): #deployments = models.ForeignKey(Schedule_Week_Data,null=True, blank=True, on_delete=models.SET_NULL) class Meta: db_table = 'namespace' - -namespace_cmm_data_object = Namespace_Data.objects.using('cloudmanager_db') \ No newline at end of file diff --git a/django_code/apps/cloudmanager/utils.py b/django_code/apps/cloudmanager/utils.py index 6bc6b56..a13dc9d 100644 --- a/django_code/apps/cloudmanager/utils.py +++ b/django_code/apps/cloudmanager/utils.py @@ -1,13 +1,121 @@ -from apps.kubernetes_connection.utils import get_namespace +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(queryset): + +def import_namespace(): namespaces_list = get_namespace() for namespace in namespaces_list: - queryset.create(namespace=namespace) + if namespace[0]!="kube-system": + Namespace_Data.objects.get_or_create(namespace=namespace) -def import_deployment(queryset): - namespaces_list = get_namespace() - #for namespace in namespaces_list: - # queryset.create(namespace=namespace) - \ No newline at end of file +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(verbose=False): + + #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: + 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: + if verbose : 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]) diff --git a/django_code/apps/kubernetes_connection/utils.py b/django_code/apps/kubernetes_connection/utils.py index 7dd6585..f85d039 100644 --- a/django_code/apps/kubernetes_connection/utils.py +++ b/django_code/apps/kubernetes_connection/utils.py @@ -32,26 +32,27 @@ def import_Deployments(): test.items[2].spec.template.spec.containers[0].name # name the third deploy within the namespace return 0 -def get_namespace(): +def get_namespace(verbose=False): config.load_kube_config(config_file='/kubeconfig/config') core = client.CoreV1Api() namespace = core.list_namespace() namespace_list = [] for i in range(0,len(namespace.items)): - print(namespace.items[i].metadata.name) + if verbose : print(namespace.items[i].metadata.name) namespace_list.append(namespace.items[i].metadata.name) return namespace_list -def get_deployments(): +def get_deployments(verbose=False): config.load_kube_config(config_file='/kubeconfig/config') api = client.AppsV1Api() namespaces_list = get_namespace() deployments_list = [] for namespace in namespaces_list: - print(namespace) + if verbose : print(namespace) deployments = api.list_namespaced_deployment(namespace) for deployment_index in range(0,len(deployments.items)): deployment = deployments.items[deployment_index].metadata.name - print(" "+str(deployment)) - deployments_list.append([namespace,deployment]) + replicas = deployments.items[deployment_index].spec.replicas + if verbose : print(" "+str(deployment)+" -- Replicas: "+str(replicas)) + deployments_list.append([namespace,deployment,replicas]) return deployments_list \ No newline at end of file diff --git a/django_code/apps/streaming/models.py b/django_code/apps/streaming/models.py index f4e0789..0d36f13 100644 --- a/django_code/apps/streaming/models.py +++ b/django_code/apps/streaming/models.py @@ -38,7 +38,7 @@ class StreamingRedirectData(models.Model): def season_information(self, serie_name): betaserie = betaserieUtils() print(serie_name) - print(betaserie.identify_serie(serie_name)) + print(betaserie.identify_serie(serie_name,True)) return betaserie.series_information(betaserie.identify_serie(serie_name))[0] def maximum_Number_Season(self, serie_name): diff --git a/django_code/apps/website_redirection/views.py b/django_code/apps/website_redirection/views.py index be77d40..d50e7e3 100644 --- a/django_code/apps/website_redirection/views.py +++ b/django_code/apps/website_redirection/views.py @@ -20,6 +20,7 @@ def redirect(request): def clearkey_process(request): key = request.GET.get('key') + key = key.lower() redirectData.objects.update_or_create(key=key,defaults={'url': "None"}) text_generated = key+" is set to None"