From 279e580a6ad6222025e9d40b0c4f8fd357354b5c Mon Sep 17 00:00:00 2001 From: gqvz <70444445+gqvz@users.noreply.github.com> Date: Sun, 6 Apr 2025 20:12:23 +0530 Subject: [PATCH 1/5] Use gopsutils to get totalMemory --- go.mod | 14 +++++++++--- go.sum | 22 +++++++++++++++++++ services/master/controllers/helper.go | 31 +++++++++++++-------------- 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 0e6a86b4..bfb61de2 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/kr/pty v1.1.8 github.com/miekg/dns v1.1.29 github.com/sdslabs/gin-jwt v1.0.0 + github.com/shirou/gopsutil/v4 v4.25.3 go.mongodb.org/mongo-driver v1.3.3 golang.org/x/crypto v0.31.0 golang.org/x/net v0.33.0 @@ -38,10 +39,12 @@ require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/go-units v0.4.0 // indirect + github.com/ebitengine/purego v0.8.2 // indirect github.com/elazarl/go-bindata-assetfs v1.0.0 // indirect github.com/emirpasic/gods v1.12.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-playground/locales v0.13.0 // indirect github.com/go-playground/universal-translator v0.17.0 // indirect github.com/go-playground/validator/v10 v10.2.0 // indirect @@ -64,6 +67,7 @@ require ( github.com/klauspost/compress v1.10.5 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mattn/go-isatty v0.0.12 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -72,17 +76,21 @@ require ( github.com/onsi/gomega v1.7.1 // indirect github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/sergi/go-diff v1.1.0 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/src-d/gcfg v1.4.0 // indirect - github.com/stretchr/testify v1.7.0 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/ugorji/go/codec v1.1.7 // indirect github.com/urfave/cli v1.22.4 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect github.com/xdg/stringprep v1.0.0 // indirect github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect @@ -93,6 +101,6 @@ require ( gopkg.in/yaml.v2 v2.3.0 // indirect ) -go 1.22 +go 1.23 -toolchain go1.23.3 +toolchain go1.24.0 diff --git a/go.sum b/go.sum index 9f402a61..c1f4304a 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,8 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= +github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/elazarl/go-bindata-assetfs v0.0.0-20150813044622-d5cac425555c/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= @@ -72,6 +74,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= @@ -128,6 +132,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -220,6 +225,8 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -257,6 +264,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -271,6 +280,8 @@ github.com/sdslabs/gin-jwt v1.0.0/go.mod h1:pUCa1hA97gksbdb1FzyQQLkP5eu72oR1HoVs github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil/v4 v4.25.3 h1:SeA68lsu8gLggyMbmCn8cmp97V1TI9ld9sVzAUcKcKE= +github.com/shirou/gopsutil/v4 v4.25.3/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= @@ -291,6 +302,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= @@ -298,6 +311,10 @@ github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= @@ -315,6 +332,8 @@ github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552 h1:tjsK9T2IA3d2FFNxzDP7AJf+EXhyuPd7PB4Z2HrtAoc= github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552/go.mod h1:hg0ZaCmQL3rze1cH8Fh2g0a9q8vQs0uN8ESpePEwSEw= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.mongodb.org/mongo-driver v1.3.3 h1:9kX7WY6sU/5qBuhm5mdnNWdqaDAQKB2qSZOd5wMEPGQ= go.mongodb.org/mongo-driver v1.3.3/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= @@ -386,7 +405,10 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/services/master/controllers/helper.go b/services/master/controllers/helper.go index 40815fb1..ab38b5ec 100644 --- a/services/master/controllers/helper.go +++ b/services/master/controllers/helper.go @@ -5,7 +5,6 @@ import ( "fmt" "math" "runtime" - "syscall" "sync" "github.com/gin-gonic/gin" @@ -13,6 +12,7 @@ import ( "github.com/sdslabs/gasper/lib/utils" "github.com/sdslabs/gasper/services/master/middlewares" "github.com/sdslabs/gasper/types" + "github.com/shirou/gopsutil/v4/mem" "go.mongodb.org/mongo-driver/mongo/options" ) @@ -50,12 +50,11 @@ func validateUpdatePayload(data types.M) error { // UpdateData updates the data of an application using the update request payload func UpdateData(app *types.ApplicationConfig, data *types.UpdatePayload) error { totalCPU := runtime.NumCPU() - var sysInfo syscall.Sysinfo_t - if err := syscall.Sysinfo(&sysInfo); err == nil { - utils.LogError("Error fetching system info:", err) + vMemory, err := mem.VirtualMemory() + if err != nil { + utils.LogError("Error fetching memory", err) } - totalMemory := sysInfo.Totalram / uint64(math.Pow(1024, 3)) - + totalMemory := float64(vMemory.Total) / math.Pow(1024, 3) if data.Password != nil { app.Password = *data.Password } @@ -81,7 +80,7 @@ func UpdateData(app *types.ApplicationConfig, data *types.UpdatePayload) error { app.Context.Run = *data.Context.Run } } - if data.Resources != nil { + if data.Resources != nil && err == nil { if data.Resources.CPU > 0 && data.Resources.CPU <= float64(totalCPU-1) { // 1 CPU reserved for system app.Resources.CPU = data.Resources.CPU } else if data.Resources.CPU > float64(totalCPU-1) && data.Resources.CPU <= float64(totalCPU) { @@ -89,9 +88,9 @@ func UpdateData(app *types.ApplicationConfig, data *types.UpdatePayload) error { } else { return errors.New("invalid cpu value") } - if data.Resources.Memory > 0 && data.Resources.Memory <= float64(totalMemory-1) { // 1 GB reserved for system + if data.Resources.Memory > 0 && data.Resources.Memory <= totalMemory-1 { // 1 GB reserved for system app.Resources.Memory = data.Resources.Memory - } else if data.Resources.Memory > float64(totalMemory-1) && data.Resources.Memory <= float64(totalMemory) { + } else if data.Resources.Memory > totalMemory-1 && data.Resources.Memory <= totalMemory { return errors.New("memory value too high, risks system failure") } else { return errors.New("invalid memory value") @@ -190,11 +189,11 @@ func Handle404(c *gin.Context) { }) } - -func deleteinstance(c *gin.Context,appName string,wg *sync.WaitGroup) { +func deleteinstance(c *gin.Context, appName string, wg *sync.WaitGroup) { defer wg.Done() - DeleteAppUsingAppname(c,appName) + DeleteAppUsingAppname(c, appName) } + // deleteUser deletes the user from database func deleteUser(c *gin.Context, userEmail string) { filter := types.M{ @@ -208,14 +207,14 @@ func deleteUser(c *gin.Context, userEmail string) { var wg sync.WaitGroup for _, instanceData := range instancesInfo { appName := instanceData["name"].(string) - wg.Add(1) - go deleteinstance(c,appName, &wg) + wg.Add(1) + go deleteinstance(c, appName, &wg) } - wg.Wait() + wg.Wait() go mongo.DeleteInstances(instanceFilter) - _,err := mongo.DeleteUser(filter) + _, err := mongo.DeleteUser(filter) if err != nil { utils.SendServerErrorResponse(c, err) return From fe776ed85b5b81c6b5c8d1517c4486d67f7c6ba0 Mon Sep 17 00:00:00 2001 From: TanmayArya-1p Date: Sun, 6 Apr 2025 20:18:11 +0530 Subject: [PATCH 2/5] Add checks in controller for ram and cpu; Add MaxMemory and MaxCpu fields in Appmaker config struct --- configs/types.go | 2 ++ services/appmaker/controller.go | 26 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/configs/types.go b/configs/types.go index 4950c9c9..8e885c5d 100644 --- a/configs/types.go +++ b/configs/types.go @@ -51,6 +51,8 @@ type AppMakerService struct { MetricsInterval time.Duration `toml:"metrics_interval"` HealthInterval time.Duration `toml:"health_interval"` AppLimit int `toml:"app_limit"` + MaxMemory float64 `toml:"max_memory"` + MaxCPU float64 `toml:"max_cpu"` } // MasterService is the default configuration for Master microservice diff --git a/services/appmaker/controller.go b/services/appmaker/controller.go index e41c7ce7..ec97413e 100644 --- a/services/appmaker/controller.go +++ b/services/appmaker/controller.go @@ -44,17 +44,25 @@ func (s *server) Create(ctx context.Context, body *pb.RequestBody) (*pb.Response maxCount := configs.ServiceConfig.AppMaker.AppLimit rateCount := configs.ServiceConfig.RateLimit timeInterval := configs.ServiceConfig.RateInterval - if !user.IsAdmin() && maxCount >= 0 { - rateLimitCount := mongo.CountInstanceInTimeFrame(body.GetOwner(), mongo.AppInstance, timeInterval) - totalCount := mongo.CountInstancesByUser(body.GetOwner(), mongo.AppInstance) - if totalCount < maxCount { - if rateLimitCount >= rateCount && rateCount >= 0 { - return nil, fmt.Errorf("cannot deploy more than %d app instances in %d hours", rateCount, timeInterval) + if !user.IsAdmin(){ + if maxCount >= 0{ + rateLimitCount := mongo.CountInstanceInTimeFrame(body.GetOwner(), mongo.AppInstance, timeInterval) + totalCount := mongo.CountInstancesByUser(body.GetOwner(), mongo.AppInstance) + if totalCount < maxCount { + if rateLimitCount >= rateCount && rateCount >= 0 { + return nil, fmt.Errorf("cannot deploy more than %d app instances in %d hours", rateCount, timeInterval) + } + } else { + return nil, fmt.Errorf("cannot deploy more than %d app instances", maxCount) } - } else { - return nil, fmt.Errorf("cannot deploy more than %d app instances", maxCount) } - } + if app.Resources.Memory > configs.ServiceConfig.AppMaker.MaxMemory { + return nil, fmt.Errorf("memory limit cannot exceed %f MB", configs.ServiceConfig.AppMaker.MaxMemory) + } + if app.Resources.CPU > configs.ServiceConfig.AppMaker.MaxCPU { + return nil, fmt.Errorf("cpu limit cannot exceed %f", configs.ServiceConfig.AppMaker.MaxCPU) + } + } app.SetLanguage(language) app.SetOwner(body.GetOwner()) From 0bca123639b6c3ad697eea7b7d2a23a0f6d269b4 Mon Sep 17 00:00:00 2001 From: TanmayArya-1p Date: Sun, 6 Apr 2025 23:36:59 +0530 Subject: [PATCH 3/5] Update sample config --- config.sample.toml | 4 ++++ configs/types.go | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/config.sample.toml b/config.sample.toml index d51b96fa..336c8f9f 100644 --- a/config.sample.toml +++ b/config.sample.toml @@ -195,6 +195,10 @@ health_interval = 300 # Hard Limits the total number of app instances that can be deployed by an user # Set app_limit = -1 if no hard limit is to be imposed app_limit = 10 +# Specifies the maximum CPU allocation for a container created by a non admin user +max_container_cpu = 0.25 +# Specifies the maximum memory allocation for a container created by a non admin user +max_container_memory = 0.5 ############################# # DbMaker Configuration # diff --git a/configs/types.go b/configs/types.go index 8e885c5d..031ff69b 100644 --- a/configs/types.go +++ b/configs/types.go @@ -48,11 +48,11 @@ type GenericService struct { // AppMakerService is the default configuration for appmaker microservice type AppMakerService struct { GenericService - MetricsInterval time.Duration `toml:"metrics_interval"` - HealthInterval time.Duration `toml:"health_interval"` - AppLimit int `toml:"app_limit"` - MaxMemory float64 `toml:"max_memory"` - MaxCPU float64 `toml:"max_cpu"` + MetricsInterval time.Duration `toml:"metrics_interval"` + HealthInterval time.Duration `toml:"health_interval"` + AppLimit int `toml:"app_limit"` + MaxContainerMemory float64 `toml:"max_container_memory"` + MaxContainerCPU float64 `toml:"max_container_cpu"` } // MasterService is the default configuration for Master microservice From 6d18673fc3ca44323ea1ca3c89e0b7f2ddd5b48f Mon Sep 17 00:00:00 2001 From: TanmayArya-1p Date: Thu, 10 Apr 2025 18:22:07 +0530 Subject: [PATCH 4/5] Change field name from MaxMemory to MaxContainerMemory Signed-off-by: TanmayArya-1p --- go.mod | 1 - services/appmaker/controller.go | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index bfb61de2..e0f4da57 100644 --- a/go.mod +++ b/go.mod @@ -81,7 +81,6 @@ require ( github.com/sergi/go-diff v1.1.0 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/src-d/gcfg v1.4.0 // indirect - github.com/stretchr/testify v1.10.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/ugorji/go/codec v1.1.7 // indirect diff --git a/services/appmaker/controller.go b/services/appmaker/controller.go index ec97413e..3c03ace7 100644 --- a/services/appmaker/controller.go +++ b/services/appmaker/controller.go @@ -44,8 +44,8 @@ func (s *server) Create(ctx context.Context, body *pb.RequestBody) (*pb.Response maxCount := configs.ServiceConfig.AppMaker.AppLimit rateCount := configs.ServiceConfig.RateLimit timeInterval := configs.ServiceConfig.RateInterval - if !user.IsAdmin(){ - if maxCount >= 0{ + if !user.IsAdmin() { + if maxCount >= 0 { rateLimitCount := mongo.CountInstanceInTimeFrame(body.GetOwner(), mongo.AppInstance, timeInterval) totalCount := mongo.CountInstancesByUser(body.GetOwner(), mongo.AppInstance) if totalCount < maxCount { @@ -56,13 +56,13 @@ func (s *server) Create(ctx context.Context, body *pb.RequestBody) (*pb.Response return nil, fmt.Errorf("cannot deploy more than %d app instances", maxCount) } } - if app.Resources.Memory > configs.ServiceConfig.AppMaker.MaxMemory { - return nil, fmt.Errorf("memory limit cannot exceed %f MB", configs.ServiceConfig.AppMaker.MaxMemory) + if app.Resources.Memory > configs.ServiceConfig.AppMaker.MaxContainerMemory { + return nil, fmt.Errorf("memory limit cannot exceed %f", configs.ServiceConfig.AppMaker.MaxContainerMemory) } - if app.Resources.CPU > configs.ServiceConfig.AppMaker.MaxCPU { - return nil, fmt.Errorf("cpu limit cannot exceed %f", configs.ServiceConfig.AppMaker.MaxCPU) + if app.Resources.CPU > configs.ServiceConfig.AppMaker.MaxContainerCPU { + return nil, fmt.Errorf("cpu limit cannot exceed %f", configs.ServiceConfig.AppMaker.MaxContainerCPU) } - } + } app.SetLanguage(language) app.SetOwner(body.GetOwner()) From c9ed6aa270677c7ffeb757f27c2aac85167d6724 Mon Sep 17 00:00:00 2001 From: Tanmay Arya Date: Sun, 18 May 2025 15:33:51 +0530 Subject: [PATCH 5/5] Add Checks For Resources Upper Limit in Update App Route --- services/master/controllers/helper.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/services/master/controllers/helper.go b/services/master/controllers/helper.go index ab38b5ec..4030ca4e 100644 --- a/services/master/controllers/helper.go +++ b/services/master/controllers/helper.go @@ -8,6 +8,7 @@ import ( "sync" "github.com/gin-gonic/gin" + "github.com/sdslabs/gasper/configs" "github.com/sdslabs/gasper/lib/mongo" "github.com/sdslabs/gasper/lib/utils" "github.com/sdslabs/gasper/services/master/middlewares" @@ -51,6 +52,12 @@ func validateUpdatePayload(data types.M) error { func UpdateData(app *types.ApplicationConfig, data *types.UpdatePayload) error { totalCPU := runtime.NumCPU() vMemory, err := mem.VirtualMemory() + + user, err := mongo.FetchSingleUserWithoutPassword(app.Owner) + if err != nil { + return errors.New("Error Fetching Owner of App") + } + if err != nil { utils.LogError("Error fetching memory", err) } @@ -82,14 +89,22 @@ func UpdateData(app *types.ApplicationConfig, data *types.UpdatePayload) error { } if data.Resources != nil && err == nil { if data.Resources.CPU > 0 && data.Resources.CPU <= float64(totalCPU-1) { // 1 CPU reserved for system - app.Resources.CPU = data.Resources.CPU + if user.IsAdmin() || data.Resources.CPU <= configs.ServiceConfig.AppMaker.MaxContainerCPU { + app.Resources.CPU = data.Resources.CPU + } else { + return fmt.Errorf("cpu limit cannot exceed %f", configs.ServiceConfig.AppMaker.MaxContainerCPU) + } } else if data.Resources.CPU > float64(totalCPU-1) && data.Resources.CPU <= float64(totalCPU) { return errors.New("cpu value too high, risks system failure") } else { return errors.New("invalid cpu value") } if data.Resources.Memory > 0 && data.Resources.Memory <= totalMemory-1 { // 1 GB reserved for system - app.Resources.Memory = data.Resources.Memory + if user.IsAdmin() || data.Resources.Memory <= configs.ServiceConfig.AppMaker.MaxContainerMemory { + app.Resources.Memory = data.Resources.Memory + } else { + return fmt.Errorf("memory limit cannot exceed %f", configs.ServiceConfig.AppMaker.MaxContainerMemory) + } } else if data.Resources.Memory > totalMemory-1 && data.Resources.Memory <= totalMemory { return errors.New("memory value too high, risks system failure") } else {