Skip to content

Commit 67fd8ff

Browse files
committed
delete all expired node on exeeding expiration date
1 parent 80da291 commit 67fd8ff

5 files changed

Lines changed: 78 additions & 7 deletions

File tree

server/app/app.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ func (a *App) startBackgroundWorkers(ctx context.Context) {
8888
go a.deployer.PeriodicDeploy(ctx, substrateBlockDiffInSeconds)
8989

9090
// remove expired vms and k8s
91+
go a.deployer.CleanExpiredVMs(ctx)
92+
go a.deployer.CleanExpiredK8S(ctx)
9193

9294
// check pending deployments
9395
a.deployer.ConsumeVMRequest(ctx, true)

server/deployer/deployer.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,70 @@ func (d *Deployer) CancelDeployment(contractID uint64, netContractID uint64, dlT
166166
return nil
167167
}
168168

169+
func (d *Deployer) CleanExpiredVMs(ctx context.Context) {
170+
ticker := time.NewTicker(24 * time.Hour)
171+
for range ticker.C {
172+
users, err := d.db.ListAllUsers()
173+
if err != nil {
174+
log.Error().Err(err).Msg("failed to get all users")
175+
return
176+
}
177+
178+
for _, user := range users {
179+
vms, err := d.db.GetAllVms(user.UserID)
180+
if err != nil {
181+
log.Error().Err(err).Msg("failed to get all user vms")
182+
continue
183+
}
184+
185+
for _, vm := range vms {
186+
if vm.ExpirationDate.Before(time.Now()) {
187+
err = d.CancelDeployment(vm.ContractID, vm.NetworkContractID, "vm", vm.Name)
188+
if err != nil {
189+
log.Error().Err(err).Msg("failed to cancel contract of expired vm")
190+
}
191+
err := d.db.DeleteVMByID(vm.ID)
192+
if err != nil {
193+
log.Error().Err(err).Msg("failed to delete expired vm")
194+
}
195+
}
196+
}
197+
}
198+
}
199+
}
200+
201+
func (d *Deployer) CleanExpiredK8S(ctx context.Context) {
202+
ticker := time.NewTicker(24 * time.Hour)
203+
for range ticker.C {
204+
users, err := d.db.ListAllUsers()
205+
if err != nil {
206+
log.Error().Err(err).Msg("failed to get all users")
207+
return
208+
}
209+
210+
for _, user := range users {
211+
k8s, err := d.db.GetAllK8s(user.UserID)
212+
if err != nil {
213+
log.Error().Err(err).Msg("failed to get all user k8s clusters")
214+
continue
215+
}
216+
217+
for _, k := range k8s {
218+
if k.ExpirationDate.Before(time.Now()) {
219+
err = d.CancelDeployment(uint64(k.ClusterContract), uint64(k.NetworkContract), "k8s", k.Master.Name)
220+
if err != nil {
221+
log.Error().Err(err).Msg("failed to cancel contract of expired k8s cluster")
222+
}
223+
err := d.db.DeleteVMByID(k.ID)
224+
if err != nil {
225+
log.Error().Err(err).Msg("failed to delete expired k8s cluster")
226+
}
227+
}
228+
}
229+
}
230+
}
231+
}
232+
169233
func buildNetwork(node uint32, name string) workloads.ZNet {
170234
return workloads.ZNet{
171235
Name: name,

server/deployer/k8s_deployer.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"fmt"
77
"net/http"
8+
"time"
89

910
"github.com/codescalers/cloud4students/middlewares"
1011
"github.com/codescalers/cloud4students/models"
@@ -154,6 +155,7 @@ func (d *Deployer) loadK8s(k8sDeployInput models.K8sDeployInput, userID string,
154155
ClusterContract: int(k8sContractID),
155156
Master: master,
156157
Workers: workers,
158+
ExpirationDate: time.Now().Add(time.Duration(k8sDeployInput.Duration) * 30 * 24 * time.Hour).Truncate(24 * time.Hour),
157159
}
158160

159161
return k8sCluster, nil

server/models/database.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (d *DB) ListAllUsers() ([]UserUsedQuota, error) {
7373
Joins("left join quota_vms on quota.id = quota_vms.quota_id").
7474
Joins("left join vouchers on vouchers.used = true and vouchers.user_id = users.id").
7575
Where("verified = true").
76-
Group("users.id, quota.id").
76+
Group("users.id").
7777
Scan(&res)
7878
return res, query.Error
7979
}

server/models/k8s.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
// Package models for database models
22
package models
33

4+
import "time"
5+
46
// K8sCluster holds all cluster data
57
type K8sCluster struct {
6-
ID int `json:"id" gorm:"primaryKey"`
7-
UserID string `json:"userID"`
8-
NetworkContract int `json:"network_contract_id"`
9-
ClusterContract int `json:"contract_id"`
10-
Master Master `json:"master" gorm:"foreignKey:ClusterID"`
11-
Workers []Worker `json:"workers" gorm:"foreignKey:ClusterID"`
8+
ID int `json:"id" gorm:"primaryKey"`
9+
UserID string `json:"userID"`
10+
NetworkContract int `json:"network_contract_id"`
11+
ClusterContract int `json:"contract_id"`
12+
Master Master `json:"master" gorm:"foreignKey:ClusterID"`
13+
Workers []Worker `json:"workers" gorm:"foreignKey:ClusterID"`
14+
ExpirationDate time.Time `json:"expiration_date"`
1215
}
1316

1417
// Master struct for kubernetes master data

0 commit comments

Comments
 (0)