@@ -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
0 commit comments