feat: add vm power actions

This commit is contained in:
Philipp
2026-06-11 11:29:29 +02:00
parent 262ec4f91b
commit d08e41b013
14 changed files with 541 additions and 16 deletions
+18 -1
View File
@@ -16,6 +16,7 @@ import (
"forgejo.digital-droplets.de/philschlo/proxui/platform/config"
"forgejo.digital-droplets.de/philschlo/proxui/platform/encryption"
"forgejo.digital-droplets.de/philschlo/proxui/platform/logging"
"github.com/hibiken/asynq"
_ "github.com/jackc/pgx/v5/stdlib"
"proxui/backend/internal/auth"
@@ -24,6 +25,7 @@ import (
"proxui/backend/internal/membership"
"proxui/backend/internal/operator"
"proxui/backend/internal/profile"
"proxui/backend/internal/queue"
"proxui/backend/internal/rbac"
"proxui/backend/internal/vm"
)
@@ -61,13 +63,25 @@ func main() {
}
defer db.Close()
queueClient := asynq.NewClient(asynq.RedisClientOpt{Addr: cfg.RedisAddr})
defer queueClient.Close()
taskEnqueuer := queue.NewEnqueuer(queueClient)
profileMiddleware := profile.NewMiddleware(profile.NewRepository(db), logger)
membershipMiddleware := membership.NewMiddleware(membership.NewRepository(db), logger)
authorizationMiddleware := authorization.NewMiddleware()
clusterRepository := cluster.NewRepository(db, tokenCipher)
clusterAdminHandler := clusteradmin.NewHandler(clusterRepository)
operatorMiddleware := operator.NewMiddleware(cfg.OperatorToken)
vmHandler := vm.NewHandler(vm.NewSQLRepository(db))
vmHandler := vm.NewHandler(
vm.NewSQLRepository(db),
vm.WithPower(vm.PowerDependencies{
Clusters: clusterRepository,
ClientFactory: vm.DefaultPowerClientFactory,
Tasks: taskEnqueuer,
Audit: vm.NewSQLPowerAuditWriter(db),
}),
)
mux := http.NewServeMux()
mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) {
@@ -104,6 +118,9 @@ func main() {
"GET /vms/{vmID}",
authMiddleware.RequireAuth(profileMiddleware.EnsureProfile(http.HandlerFunc(vmHandler.GetVM))),
)
mux.Handle("POST /vms/{vmID}/start", authMiddleware.RequireAuth(profileMiddleware.EnsureProfile(http.HandlerFunc(vmHandler.StartVM))))
mux.Handle("POST /vms/{vmID}/stop", authMiddleware.RequireAuth(profileMiddleware.EnsureProfile(http.HandlerFunc(vmHandler.StopVM))))
mux.Handle("POST /vms/{vmID}/reboot", authMiddleware.RequireAuth(profileMiddleware.EnsureProfile(http.HandlerFunc(vmHandler.RebootVM))))
clusterManageChain := func(handler http.HandlerFunc) http.Handler {
return operatorMiddleware.RequireOperator(authorizationMiddleware.Require(rbac.ActionClusterManage, handler))
}