Merge pull request 'Testing' (#43) from testing into main
Dockerfile runner / Explore-Gitea-Actions (push) Successful in 2m39s

Reviewed-on: http://gitea.geeraert.eu/pi-ux-ce/Django_kube/pulls/43
This commit was merged in pull request #43.
This commit is contained in:
2026-09-11 09:23:12 +00:00
10 changed files with 104 additions and 84 deletions
+36 -24
View File
@@ -1,8 +1,10 @@
from django.contrib import admin,messages from django.contrib import admin,messages
from django.utils.translation import ngettext from django.utils.translation import ngettext
from .models import Deployment_Data,Schedule_Day_Data,Schedule_Week_Data,Namespace_Data 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 apps.kubernetes_connection.utils import scale_up,scale_down
from admin_extra_buttons.api import ExtraButtonsMixin, button
DB = 'cloudmanager_db' DB = 'cloudmanager_db'
@@ -50,21 +52,6 @@ def Check_server_supposed_true(modeladmin, request, queryset):
for server in servers_supposed_false: for server in servers_supposed_false:
messages.add_message(request, messages.INFO, server) 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): class ActiveAtHourFilter(admin.SimpleListFilter):
title = 'Active at hour' title = 'Active at hour'
@@ -98,27 +85,52 @@ class MultiDBModelAdmin(admin.ModelAdmin):
@admin.register(Deployment_Data) @admin.register(Deployment_Data)
class DeploymentDataAdmin(MultiDBModelAdmin): class DeploymentDataAdmin(ExtraButtonsMixin, MultiDBModelAdmin):
list_display = ('name', 'namespace', 'schedule_week', 'schedule_day', 'replicas') list_display = ('name', 'namespace', 'schedule_week', 'schedule_day', 'replicas')
list_filter = (ActiveAtHourFilter,) 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) @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)] 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) @admin.register(Schedule_Week_Data)
class ScheduleWeekAdmin(MultiDBModelAdmin): class ScheduleWeekAdmin(ExtraButtonsMixin,MultiDBModelAdmin):
list_display = ( list_display = (
'name_schedule', 'name_schedule',
'state_Monday', 'state_Tuesday', 'state_Wednesday', 'state_Monday', 'state_Tuesday', 'state_Wednesday',
'state_Thursday', 'state_Friday', 'state_Saturday', 'state_Sunday', '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) @admin.register(Namespace_Data)
class NamespaceAdmin(MultiDBModelAdmin): class NamespaceAdmin(ExtraButtonsMixin, MultiDBModelAdmin):
list_display = ('namespace',) list_display = ('namespace',)
actions = [import_namespace_admin]
@button()
def import_namespace(self, request):
# your business logic here
import_namespace()
self.message_user(request, 'Namespaces imported')
-31
View File
@@ -1,37 +1,6 @@
from django.apps import AppConfig 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): class CloudmanagerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.cloudmanager' name = 'apps.cloudmanager'
label = 'cloudmanager' label = 'cloudmanager'
def coucou(request):
return HttpResponse('<h1>Hello cmm!</h1>')
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})
@@ -154,10 +154,6 @@ def main(request):
#print(Is_the_server_already_wanted_state(112, "stopped")) #print(Is_the_server_already_wanted_state(112, "stopped"))
return HttpResponse('<h1>CMM executed!</h1>') return HttpResponse('<h1>CMM executed!</h1>')
if __name__ == "__main__":
main()
""" """
TO DO: TO DO:
EXTRACT TYPE OF MACHINE EXTRACT TYPE OF MACHINE
+8 -17
View File
@@ -15,25 +15,16 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.urls import path 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 = [ urlpatterns = [
################### cloudmanager ################### ################### cloudmanager ###################
path('', cloudmanager_apps.redirect), path('', hello, name='hello'),
path('hello', cloudmanager_apps.hello, name='hello'), path('coucou', coucou, name='coucou'),
path('coucou', cloudmanager_views.coucou, name='coucou'), path('display', display, name='display'),
path('display', cloudmanager_views.display, name='display'), path('import_namespace', import_namespace_view, name='import_namespace'),
#path('/run-action/', cloudmanager_views.trigger_my_action, name='run_my_action_url'), path('retrieve_and_apply_view', retrieve_and_apply_view, name='retrieve_and_apply_view'),
#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/<str:namespace_name>/<str:deploy_name>', dashboardview.scale_up),
path('scale_down/<str:namespace_name>/<str:deploy_name>', dashboardview.scale_down),
] ]
+22 -3
View File
@@ -17,8 +17,13 @@ def import_deployment():
Schedule_Week_Always_off,Schedule_Week_Always_on = generate_default_week_schedule() Schedule_Week_Always_off,Schedule_Week_Always_on = generate_default_week_schedule()
for deployment in deployment_list: 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": 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(): def generate_default_day_schedule():
@@ -92,6 +97,10 @@ def Check_server_supposed_XXX(expected_status,verbose=False):
def retrieve_and_apply(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 replica to compare with the replicas created at the start
get_current_replicas() get_current_replicas()
@@ -105,7 +114,11 @@ def retrieve_and_apply(verbose=False):
if server[3].actual_replica == server[2]: if server[3].actual_replica == server[2]:
if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already UP") if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already UP")
else: 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]) scale_up(namespace_name=server[1],deploy_name=server[0],replicas=server[2])
print("------------------------------------------") print("------------------------------------------")
@@ -117,5 +130,11 @@ def retrieve_and_apply(verbose=False):
if server[3].actual_replica == 0: if server[3].actual_replica == 0:
if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already DOWN") if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already DOWN")
else: 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]) scale_down(namespace_name=server[1],deploy_name=server[0])
return output
+33 -1
View File
@@ -1,7 +1,10 @@
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render
# IMPORT AT THE TOP HERE: This is completely safe! # 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): def coucou(request):
# 1. Prepare the data inside the function # 1. Prepare the data inside the function
@@ -23,3 +26,32 @@ def display(request):
print(data[0].namespace) print(data[0].namespace)
return HttpResponse(data) 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('<h1>Namespace imported!</h1>')
def retrieve_and_apply_view(request):
output = retrieve_and_apply()
return HttpResponse('<h1>'+output+'</h1>')
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})
+1 -1
View File
@@ -1,4 +1,4 @@
import redis #import redis
from django.http import HttpResponse from django.http import HttpResponse
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
+1
View File
@@ -53,6 +53,7 @@ INSTALLED_APPS = [
'apps.streaming.apps.StreamingConfig', 'apps.streaming.apps.StreamingConfig',
'import_export', 'import_export',
'djangoql', 'djangoql',
'admin_extra_buttons',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
+1 -1
View File
@@ -1,6 +1,5 @@
django django
psycopg2 psycopg2
#xrequests
kubernetes kubernetes
ruamel.yaml ruamel.yaml
pyyaml pyyaml
@@ -17,3 +16,4 @@ bitwarden_sdk
xmltodict xmltodict
whitenoise whitenoise
djangoql djangoql
django-admin-extra-buttons