Skip to content

Commit

Permalink
delete all expired node on exeeding expiration date
Browse files Browse the repository at this point in the history
  • Loading branch information
Eslam-Nawara committed Dec 11, 2023
1 parent 80da291 commit 76b07ee
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 6 deletions.
2 changes: 2 additions & 0 deletions server/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ func (a *App) startBackgroundWorkers(ctx context.Context) {
go a.deployer.PeriodicDeploy(ctx, substrateBlockDiffInSeconds)

// remove expired vms and k8s
go a.deployer.CleanExpiredVMs(ctx)
go a.deployer.CleanExpiredK8S(ctx)

// check pending deployments
a.deployer.ConsumeVMRequest(ctx, true)
Expand Down
64 changes: 64 additions & 0 deletions server/deployer/deployer.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,70 @@ func (d *Deployer) CancelDeployment(contractID uint64, netContractID uint64, dlT
return nil
}

func (d *Deployer) CleanExpiredVMs(ctx context.Context) {
ticker := time.NewTicker(24 * time.Hour)
for range ticker.C {
users, err := d.db.ListAllUsers()
if err != nil {
log.Error().Err(err).Msg("failed to get all users")
return
}

for _, user := range users {
vms, err := d.db.GetAllVms(user.UserID)
if err != nil {
log.Error().Err(err).Msg("failed to get all user vms")
continue
}

for _, vm := range vms {
if vm.ExpirationDate.Before(time.Now()) {
err = d.CancelDeployment(vm.ContractID, vm.NetworkContractID, "vm", vm.Name)
if err != nil {
log.Error().Err(err).Msg("failed to cancel contract of expired vm")
}
err := d.db.DeleteVMByID(vm.ID)
if err != nil {
log.Error().Err(err).Msg("failed to delete expired vm")
}
}
}
}
}
}

func (d *Deployer) CleanExpiredK8S(ctx context.Context) {
ticker := time.NewTicker(24 * time.Hour)
for range ticker.C {
users, err := d.db.ListAllUsers()
if err != nil {
log.Error().Err(err).Msg("failed to get all users")
return
}

for _, user := range users {
k8s, err := d.db.GetAllK8s(user.UserID)
if err != nil {
log.Error().Err(err).Msg("failed to get all user k8s clusters")
continue
}

for _, k := range k8s {
if k.ExpirationDate.Before(time.Now()) {
err = d.CancelDeployment(uint64(k.ClusterContract), uint64(k.NetworkContract), "k8s", k.Master.Name)
if err != nil {
log.Error().Err(err).Msg("failed to cancel contract of expired k8s cluster")
}
err := d.db.DeleteVMByID(k.ID)
if err != nil {
log.Error().Err(err).Msg("failed to delete expired k8s cluster")
}
}
}
}
}
}

func buildNetwork(node uint32, name string) workloads.ZNet {
return workloads.ZNet{
Name: name,
Expand Down
2 changes: 2 additions & 0 deletions server/deployer/k8s_deployer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"context"
"fmt"
"net/http"
"time"

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

return k8sCluster, nil
Expand Down
15 changes: 9 additions & 6 deletions server/models/k8s.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
// Package models for database models
package models

import "time"

// K8sCluster holds all cluster data
type K8sCluster struct {
ID int `json:"id" gorm:"primaryKey"`
UserID string `json:"userID"`
NetworkContract int `json:"network_contract_id"`
ClusterContract int `json:"contract_id"`
Master Master `json:"master" gorm:"foreignKey:ClusterID"`
Workers []Worker `json:"workers" gorm:"foreignKey:ClusterID"`
ID int `json:"id" gorm:"primaryKey"`
UserID string `json:"userID"`
NetworkContract int `json:"network_contract_id"`
ClusterContract int `json:"contract_id"`
Master Master `json:"master" gorm:"foreignKey:ClusterID"`
Workers []Worker `json:"workers" gorm:"foreignKey:ClusterID"`
ExpirationDate time.Time `json:"expiration_date"`
}

// Master struct for kubernetes master data
Expand Down

0 comments on commit 76b07ee

Please sign in to comment.