Skip to content

Commit dcfeca3

Browse files
committed
add vms and clusters per user while listing all
1 parent 8f86730 commit dcfeca3

6 files changed

Lines changed: 396 additions & 125 deletions

File tree

server/app/admin_handler.go

Lines changed: 105 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import (
66
"errors"
77
"fmt"
88
"net/http"
9+
"strconv"
910
"strings"
1011
"time"
1112

1213
"github.com/codescalers/cloud4students/internal"
1314
"github.com/codescalers/cloud4students/models"
15+
"github.com/gorilla/mux"
1416
"github.com/rs/zerolog/log"
1517
"gopkg.in/validator.v2"
1618
"gorm.io/gorm"
@@ -53,9 +55,11 @@ type SetPricesInput struct {
5355
PublicIP float64 `json:"public_ip"`
5456
}
5557

56-
type ListDeploymentsResponse struct {
57-
VMs []models.VM `json:"vms"`
58-
K8S []models.K8sCluster `json:"k8s"`
58+
type UserResponse struct {
59+
*models.User
60+
VMs []models.VM `json:"vms"`
61+
K8S []models.K8sCluster `json:"k8s"`
62+
Count models.DeploymentsCount `json:"count"`
5963
}
6064

6165
// GetAllUsersHandler returns all users
@@ -66,7 +70,7 @@ type ListDeploymentsResponse struct {
6670
// @Accept json
6771
// @Produce json
6872
// @Security BearerAuth
69-
// @Success 200 {object} []models.User
73+
// @Success 200 {object} []UserResponse
7074
// @Failure 400 {object} Response
7175
// @Failure 401 {object} Response
7276
// @Failure 404 {object} Response
@@ -86,9 +90,40 @@ func (a *App) GetAllUsersHandler(req *http.Request) (interface{}, Response) {
8690
return nil, InternalServerError(errors.New(internalServerErrorMsg))
8791
}
8892

93+
var allUsers []UserResponse
94+
95+
for _, user := range users {
96+
// vms
97+
vms, err := a.db.GetAllVms(user.ID.String())
98+
if err != nil && err != gorm.ErrRecordNotFound {
99+
log.Error().Err(err).Send()
100+
return nil, InternalServerError(errors.New(internalServerErrorMsg))
101+
}
102+
103+
// k8s clusters
104+
clusters, err := a.db.GetAllK8s(user.ID.String())
105+
if err != nil && err != gorm.ErrRecordNotFound {
106+
log.Error().Err(err).Send()
107+
return nil, InternalServerError(errors.New(internalServerErrorMsg))
108+
}
109+
110+
count, err := a.db.CountUserDeployments(user.ID.String())
111+
if err != nil && err != gorm.ErrRecordNotFound {
112+
log.Error().Err(err).Send()
113+
return nil, InternalServerError(errors.New(internalServerErrorMsg))
114+
}
115+
116+
allUsers = append(allUsers, UserResponse{
117+
User: &user,
118+
VMs: vms,
119+
K8S: clusters,
120+
Count: count,
121+
})
122+
}
123+
89124
return ResponseMsg{
90125
Message: "Users are found",
91-
Data: users,
126+
Data: allUsers,
92127
}, Ok()
93128
}
94129

@@ -235,6 +270,71 @@ func (a *App) GetBalanceHandler(req *http.Request) (interface{}, Response) {
235270
}, Ok()
236271
}
237272

273+
// DeleteVMDeploymentHandler deletes a virtual machine
274+
// Example endpoint: Deletes a virtual machine
275+
// @Summary Deletes a virtual machine
276+
// @Description Deletes a virtual machine
277+
// @Tags Admin
278+
// @Accept json
279+
// @Produce json
280+
// @Security BearerAuth
281+
// @Param id path string true "Virtual machine ID"
282+
// @Success 200 {object} Response
283+
// @Failure 400 {object} Response
284+
// @Failure 401 {object} Response
285+
// @Failure 404 {object} Response
286+
// @Failure 500 {object} Response
287+
// @Router /deployments/vm/{id} [delete]
288+
func (a *App) DeleteVMDeploymentHandler(req *http.Request) (interface{}, Response) {
289+
id, err := strconv.Atoi(mux.Vars(req)["id"])
290+
if err != nil {
291+
return nil, BadRequest(errors.New("failed to read deployment id"))
292+
}
293+
294+
if err = a.db.DeleteVMByID(id); err != nil {
295+
log.Error().Err(err).Send()
296+
return nil, InternalServerError(errors.New(internalServerErrorMsg))
297+
}
298+
299+
return ResponseMsg{
300+
Message: "Virtual machine is deleted successfully",
301+
}, Ok()
302+
}
303+
304+
// DeleteK8sDeploymentHandler deletes a kubernetes cluster
305+
// Example endpoint: Deletes a kubernetes cluster
306+
// @Summary Deletes a kubernetes cluster
307+
// @Description Deletes a kubernetes cluster
308+
// @Tags Admin
309+
// @Accept json
310+
// @Produce json
311+
// @Security BearerAuth
312+
// @Param id path string true "Kubernetes cluster ID"
313+
// @Success 200 {object} Response
314+
// @Failure 400 {object} Response
315+
// @Failure 401 {object} Response
316+
// @Failure 404 {object} Response
317+
// @Failure 500 {object} Response
318+
// @Router /deployments/k8s/{id} [delete]
319+
func (a *App) DeleteK8sDeploymentHandler(req *http.Request) (interface{}, Response) {
320+
id, err := strconv.Atoi(mux.Vars(req)["id"])
321+
if err != nil {
322+
return nil, BadRequest(errors.New("failed to read deployment id"))
323+
}
324+
325+
if err = a.db.DeleteK8s(id); err == gorm.ErrRecordNotFound {
326+
return nil, NotFound(errors.New("kubernetes cluster is not found"))
327+
}
328+
if err != nil {
329+
log.Error().Err(err).Send()
330+
return nil, InternalServerError(errors.New(internalServerErrorMsg))
331+
}
332+
333+
return ResponseMsg{
334+
Message: "Kubernetes cluster is deleted successfully",
335+
}, Ok()
336+
}
337+
238338
// DeleteAllDeploymentsHandler deletes all users' deployments
239339
// Example endpoint: Deletes all users' deployments
240340
// @Summary Deletes all users' deployments
@@ -319,70 +419,6 @@ func (a *App) DeleteAllDeploymentsHandler(req *http.Request) (interface{}, Respo
319419
}, Ok()
320420
}
321421

322-
// ListDeploymentsHandler lists all users' deployments
323-
// Example endpoint: List all users' deployments
324-
// @Summary List all users' deployments
325-
// @Description List all users' deployments
326-
// @Tags Admin
327-
// @Accept json
328-
// @Produce json
329-
// @Security BearerAuth
330-
// @Success 200 {object} ListDeploymentsResponse
331-
// @Failure 400 {object} Response
332-
// @Failure 401 {object} Response
333-
// @Failure 404 {object} Response
334-
// @Failure 500 {object} Response
335-
// @Router /deployments [get]
336-
func (a *App) ListDeploymentsHandler(req *http.Request) (interface{}, Response) {
337-
users, err := a.db.ListAllUsers()
338-
if err == gorm.ErrRecordNotFound || len(users) == 0 {
339-
return ResponseMsg{
340-
Message: "Users are not found",
341-
}, Ok()
342-
}
343-
344-
if err != nil {
345-
log.Error().Err(err).Send()
346-
return nil, InternalServerError(errors.New(internalServerErrorMsg))
347-
}
348-
349-
var allVMs []models.VM
350-
var allClusters []models.K8sCluster
351-
352-
for _, user := range users {
353-
// vms
354-
vms, err := a.db.GetAllVms(user.ID.String())
355-
if err == gorm.ErrRecordNotFound || len(vms) == 0 {
356-
log.Error().Err(err).Str("userID", user.ID.String()).Msg("Virtual machines are not found")
357-
continue
358-
}
359-
if err != nil {
360-
log.Error().Err(err).Send()
361-
return nil, InternalServerError(errors.New(internalServerErrorMsg))
362-
}
363-
364-
allVMs = append(allVMs, vms...)
365-
366-
// k8s clusters
367-
clusters, err := a.db.GetAllK8s(user.ID.String())
368-
if err == gorm.ErrRecordNotFound || len(clusters) == 0 {
369-
log.Error().Err(err).Str("userID", user.ID.String()).Msg("Kubernetes clusters are not found")
370-
continue
371-
}
372-
if err != nil {
373-
log.Error().Err(err).Send()
374-
return nil, InternalServerError(errors.New(internalServerErrorMsg))
375-
}
376-
377-
allClusters = append(allClusters, clusters...)
378-
}
379-
380-
return ResponseMsg{
381-
Message: "Deployments are listed successfully",
382-
Data: ListDeploymentsResponse{VMs: allVMs, K8S: allClusters},
383-
}, Ok()
384-
}
385-
386422
// UpdateMaintenanceHandler updates maintenance flag
387423
// Example endpoint: Updates maintenance flag
388424
// @Summary Updates maintenance flag

server/app/app.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ func (a *App) registerHandlers() {
190190
balanceRouter.HandleFunc("", WrapFunc(a.GetBalanceHandler)).Methods("GET", "OPTIONS")
191191
maintenanceRouter.HandleFunc("", WrapFunc(a.UpdateMaintenanceHandler)).Methods("PUT", "OPTIONS")
192192
deploymentsRouter.HandleFunc("", WrapFunc(a.DeleteAllDeploymentsHandler)).Methods("DELETE", "OPTIONS")
193-
deploymentsRouter.HandleFunc("", WrapFunc(a.ListDeploymentsHandler)).Methods("GET", "OPTIONS")
193+
deploymentsRouter.HandleFunc("/vm/{id}", WrapFunc(a.DeleteVMDeploymentHandler)).Methods("DELETE", "OPTIONS")
194+
deploymentsRouter.HandleFunc("/k8s/{id}", WrapFunc(a.DeleteK8sDeploymentHandler)).Methods("DELETE", "OPTIONS")
194195
deploymentsRouter.HandleFunc("/count", WrapFunc(a.GetDlsCountHandler)).Methods("GET", "OPTIONS")
195196
nextLaunchRouter.HandleFunc("", WrapFunc(a.UpdateNextLaunchHandler)).Methods("PUT", "OPTIONS")
196197

0 commit comments

Comments
 (0)