diff --git a/django_code/apps/cloudmanager/admin.py b/django_code/apps/cloudmanager/admin.py index bb6b80e..253caf2 100644 --- a/django_code/apps/cloudmanager/admin.py +++ b/django_code/apps/cloudmanager/admin.py @@ -1,8 +1,10 @@ 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 -from .utils import import_namespace,import_deployment,generate_default_day_schedule,generate_default_week_schedule,Check_server_supposed_XXX +from .utils import import_namespace,import_deployment,generate_default_day_schedule,generate_default_week_schedule,Check_server_supposed_XXX,retrieve_and_apply from apps.kubernetes_connection.utils import scale_up,scale_down +from admin_extra_buttons.api import ExtraButtonsMixin, button + DB = 'cloudmanager_db' @@ -49,21 +51,6 @@ 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): - import_namespace() - -@admin.action(description="import deployment") -def import_deployment_admin(modeladmin, request, queryset): - import_deployment() - class ActiveAtHourFilter(admin.SimpleListFilter): @@ -98,27 +85,52 @@ class MultiDBModelAdmin(admin.ModelAdmin): @admin.register(Deployment_Data) -class DeploymentDataAdmin(MultiDBModelAdmin): +class DeploymentDataAdmin(ExtraButtonsMixin, MultiDBModelAdmin): list_display = ('name', 'namespace', 'schedule_week', 'schedule_day', 'replicas') list_filter = (ActiveAtHourFilter,) - actions = [Check_server_supposed_False,Check_server_supposed_true,scale_up_deploy,scale_down_deploy,import_deployment_admin,generate_default_day_schedule_admin] - + actions = [Check_server_supposed_False,Check_server_supposed_true,scale_up_deploy,scale_down_deploy] + @button() + def retrieve_and_apply(self, request): + # your business logic here + retrieve_and_apply() + self.message_user(request, 'Operation started') + + @button() + def import_deployment(self, request): + # your business logic here + import_deployment() + self.message_user(request, 'Deployments imported') @admin.register(Schedule_Day_Data) -class ScheduleDayAdmin(MultiDBModelAdmin): +class ScheduleDayAdmin(ExtraButtonsMixin,MultiDBModelAdmin): list_display = ['name_schedule'] + [f'state_at_{h}' for h in range(24)] - actions = [import_deployment_admin,generate_default_day_schedule_admin] + @button() + def generate_default_day_schedule_admin(self, request): + generate_default_day_schedule() + generate_default_week_schedule() + self.message_user(request, 'Created default schedules') @admin.register(Schedule_Week_Data) -class ScheduleWeekAdmin(MultiDBModelAdmin): +class ScheduleWeekAdmin(ExtraButtonsMixin,MultiDBModelAdmin): list_display = ( 'name_schedule', 'state_Monday', 'state_Tuesday', 'state_Wednesday', 'state_Thursday', 'state_Friday', 'state_Saturday', 'state_Sunday', ) - actions = [import_deployment_admin,generate_default_day_schedule_admin] + @button() + def generate_default_day_schedule_admin(self, request): + generate_default_day_schedule() + generate_default_week_schedule() + self.message_user(request, 'Created default schedules') + @admin.register(Namespace_Data) -class NamespaceAdmin(MultiDBModelAdmin): +class NamespaceAdmin(ExtraButtonsMixin, MultiDBModelAdmin): list_display = ('namespace',) - actions = [import_namespace_admin] \ No newline at end of file + + + @button() + def import_namespace(self, request): + # your business logic here + import_namespace() + self.message_user(request, 'Namespaces imported') diff --git a/django_code/apps/cloudmanager/apps.py b/django_code/apps/cloudmanager/apps.py index 3256025..49bf34c 100644 --- a/django_code/apps/cloudmanager/apps.py +++ b/django_code/apps/cloudmanager/apps.py @@ -1,37 +1,6 @@ from django.apps import AppConfig -from django.http import HttpResponse -from django.http import HttpResponseRedirect -from django.shortcuts import render -import os -#import psycopg2 -from apps.cloudmanager.db_interaction import DB_generation,Check_server_supposed_XXX,Give_current_weekday,Give_current_hour - class CloudmanagerConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.cloudmanager' label = 'cloudmanager' - -def coucou(request): - return HttpResponse('

Hello cmm!

') - -def hello(request): - list_schedule = ['schedule1','schedule2'] - list_servers_up = [['wiki', 'wikijs', 2], ['book', 'bookstack-db', 1]] - return render(request, 'cloudmanager/index.html', {'list_schedule':list_schedule,'list_servers_up':list_servers_up}) - -def redirect(request): - db_host = os.environ.get('DB_HOST') - db_port = os.environ.get('DB_PORT') - db_user = os.environ.get('DB_USERNAME') - db_password = os.environ.get('DB_PASSWORD') - db_name = os.environ.get('CUSTOM_DB_DATABASE',os.environ.get('DB_DATABASE')) - - generated_db = DB_generation(db_host, db_port, db_user, db_password,db_name) - ##operation: - ## Server(s) supposed to be UP - - list_servers_up = Check_server_supposed_XXX(generated_db, "up", Give_current_hour(),Give_current_weekday()) - print(list_servers_up) - return render(request, 'cloudmanager/cmm_blank_page.html', {'list_servers_up':list_servers_up}) - diff --git a/django_code/apps/cloudmanager/db_interaction.py b/django_code/apps/cloudmanager/db_interaction.py index 309f9b8..1dc7ccf 100644 --- a/django_code/apps/cloudmanager/db_interaction.py +++ b/django_code/apps/cloudmanager/db_interaction.py @@ -153,10 +153,6 @@ def main(request): #print(Is_the_server_already_wanted_state(112, "stopped")) return HttpResponse('

CMM executed!

') - -if __name__ == "__main__": - main() - """ TO DO: diff --git a/django_code/apps/cloudmanager/urls.py b/django_code/apps/cloudmanager/urls.py index 315940e..2b05d99 100644 --- a/django_code/apps/cloudmanager/urls.py +++ b/django_code/apps/cloudmanager/urls.py @@ -15,25 +15,16 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.urls import path -from apps.cloudmanager import apps as cloudmanager_apps -from apps.cloudmanager import views as cloudmanager_views + +from .views import coucou,display,hello,import_namespace_view,retrieve_and_apply_view + urlpatterns = [ ################### cloudmanager ################### - path('', cloudmanager_apps.redirect), - path('hello', cloudmanager_apps.hello, name='hello'), - path('coucou', cloudmanager_views.coucou, name='coucou'), - path('display', cloudmanager_views.display, name='display'), - #path('/run-action/', cloudmanager_views.trigger_my_action, name='run_my_action_url'), - #path('change-schedule/', cloudmanager_views.change_schedule, name='change_schedule'), - #path('/main/', db_interaction.main), - - ################### onenote ################### - path('dashboard/', dashboardapp.hello), - path('view/about', dashboardview.about), - path('view/home', dashboardview.home), - path('view/success', dashboardview.success), - path('scale_up//', dashboardview.scale_up), - path('scale_down//', dashboardview.scale_down), + path('', hello, name='hello'), + path('coucou', coucou, name='coucou'), + path('display', display, name='display'), + path('import_namespace', import_namespace_view, name='import_namespace'), + path('retrieve_and_apply_view', retrieve_and_apply_view, name='retrieve_and_apply_view'), ] diff --git a/django_code/apps/cloudmanager/utils.py b/django_code/apps/cloudmanager/utils.py index a13dc9d..cebfe21 100644 --- a/django_code/apps/cloudmanager/utils.py +++ b/django_code/apps/cloudmanager/utils.py @@ -17,8 +17,13 @@ def import_deployment(): 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_Day_Always_on,"schedule_week":Schedule_Week_Always_on}) + 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(): @@ -92,6 +97,10 @@ def Check_server_supposed_XXX(expected_status,verbose=False): def retrieve_and_apply(verbose=False): + output = "" + output += str(Give_current_hour()) + output += str("\n") + #Get current replica to compare with the replicas created at the start get_current_replicas() @@ -105,7 +114,11 @@ def retrieve_and_apply(verbose=False): 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])) + echo = "Starting -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2]) + output += str(echo) + output += "\n" + print(echo) + scale_up(namespace_name=server[1],deploy_name=server[0],replicas=server[2]) print("------------------------------------------") @@ -117,5 +130,11 @@ def retrieve_and_apply(verbose=False): 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])) + + echo = "Shutting down -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2]) + output += str(echo) + output += str("\n") + print(echo) scale_down(namespace_name=server[1],deploy_name=server[0]) + + return output \ No newline at end of file diff --git a/django_code/apps/cloudmanager/views.py b/django_code/apps/cloudmanager/views.py index 37c8efe..484e67b 100644 --- a/django_code/apps/cloudmanager/views.py +++ b/django_code/apps/cloudmanager/views.py @@ -1,7 +1,10 @@ from django.http import HttpResponse +from django.shortcuts import render # IMPORT AT THE TOP HERE: This is completely safe! -from apps.cloudmanager.models import Deployment_Data,Schedule_Week_Data +from .models import Deployment_Data,Schedule_Week_Data +from .db_interaction import DB_generation,Check_server_supposed_XXX,Give_current_weekday,Give_current_hour +from .utils import import_namespace,retrieve_and_apply def coucou(request): # 1. Prepare the data inside the function @@ -23,3 +26,32 @@ def display(request): print(data[0].namespace) return HttpResponse(data) +def hello(request): + list_schedule = ['schedule1','schedule2'] + list_servers_up = [['wiki', 'wikijs', 2], ['book', 'bookstack-db', 1]] + return render(request, 'cloudmanager/index.html', {'list_schedule':list_schedule,'list_servers_up':list_servers_up}) + +def import_namespace_view(request): + import_namespace() + return HttpResponse('

Namespace imported!

') + + +def retrieve_and_apply_view(request): + output = retrieve_and_apply() + return HttpResponse('

'+output+'

') + +def redirect(request): + db_host = os.environ.get('DB_HOST') + db_port = os.environ.get('DB_PORT') + db_user = os.environ.get('DB_USERNAME') + db_password = os.environ.get('DB_PASSWORD') + db_name = os.environ.get('CUSTOM_DB_DATABASE',os.environ.get('DB_DATABASE')) + + generated_db = DB_generation(db_host, db_port, db_user, db_password,db_name) + ##operation: + ## Server(s) supposed to be UP + + list_servers_up = Check_server_supposed_XXX(generated_db, "up", Give_current_hour(),Give_current_weekday()) + print(list_servers_up) + return render(request, 'cloudmanager/cmm_blank_page.html', {'list_servers_up':list_servers_up}) + diff --git a/django_code/apps/podcast_aggregator/admin.py b/django_code/apps/podcast_aggregator/admin.py index ecbf68e..932142f 100644 --- a/django_code/apps/podcast_aggregator/admin.py +++ b/django_code/apps/podcast_aggregator/admin.py @@ -10,4 +10,4 @@ class JobAdmin(ImportExportModelAdmin): list_display = ('podcast_name','clickable_links','enabled') def clickable_links(self, obj): - return format_html('{}', obj.podcast_url,obj.podcast_url) \ No newline at end of file + return format_html('{}', obj.podcast_url,obj.podcast_url) diff --git a/django_code/apps/website_redirection/apps.py b/django_code/apps/website_redirection/apps.py index e11a364..db0bdd2 100644 --- a/django_code/apps/website_redirection/apps.py +++ b/django_code/apps/website_redirection/apps.py @@ -1,4 +1,4 @@ -import redis +#import redis from django.http import HttpResponse from django.http import HttpResponseRedirect from django.shortcuts import render diff --git a/django_code/core/settings.py b/django_code/core/settings.py index a242416..0434252 100644 --- a/django_code/core/settings.py +++ b/django_code/core/settings.py @@ -53,6 +53,7 @@ INSTALLED_APPS = [ 'apps.streaming.apps.StreamingConfig', 'import_export', 'djangoql', + 'admin_extra_buttons', ] MIDDLEWARE = [ diff --git a/requirements.txt b/requirements.txt index 50bc442..e10497c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ django psycopg2 -#xrequests kubernetes ruamel.yaml pyyaml @@ -17,3 +16,4 @@ bitwarden_sdk xmltodict whitenoise djangoql +django-admin-extra-buttons