package apps import ( "github.com/rosti-cz/node-api/common" ) func init() { db := common.GetDBConnection() db.AutoMigrate(Label{}) db.AutoMigrate(App{}) } // Get returns one app func Get(name string) (*App, error) { var app App db := common.GetDBConnection() err := db.Preload("Labels").Where("name = ?", name).First(&app).Error if err != nil { return nil, err } return &app, nil } // List returns all apps located on this node func List() (*Apps, error) { var apps Apps db := common.GetDBConnection() err := db.Preload("Labels").Find(&apps).Error if err != nil { return nil, err } return &apps, nil } // New creates new record about application in the database func New(name string, SSHPort int, HTTPPort int, image string, CPU int, memory int) error { app := App{ Name: name, SSHPort: SSHPort, HTTPPort: HTTPPort, Image: image, CPU: CPU, Memory: memory, } db := common.GetDBConnection() validationErrors := app.Validate() if len(validationErrors) != 0 { return ValidationError{ Errors: validationErrors, } } if err := db.Create(&app).Error; err != nil { return err } return nil } // Update changes value about app in the database func Update(name string, SSHPort int, HTTPPort int, image string, CPU int, memory int) (*App, error) { var app App db := common.GetDBConnection() err := db.Where("name = ?", name).First(&app).Error if err != nil { return &app, err } // Update affected fields if image != "" { app.Image = image } if CPU != 0 { app.CPU = CPU } if memory != 0 { app.Memory = memory } // SSH port and HTTP port cannot be turned off when they are once set if SSHPort != 0 { app.SSHPort = SSHPort } // SSH port and HTTP port cannot be turned off when they are once set if HTTPPort != 0 { app.HTTPPort = HTTPPort } validationErrors := app.Validate() if len(validationErrors) != 0 { return &app, ValidationError{ Errors: validationErrors, } } // Apply the changes err = db.Save(&app).Error return &app, err } // UpdateResources updates various metrics saved in the database func UpdateResources(name string, state string, CPUUsage float64, memory int, diskUsageBytes int, diskUsageInodes int) error { db := common.GetDBConnection() err := db.Model(&App{}).Where("name = ?", name).Updates(App{ State: state, CPUUsage: CPUUsage, MemoryUsage: memory, DiskUsageBytes: diskUsageBytes, DiskUsageInodes: diskUsageInodes, }).Error return err } // UpdateState sets container's state func UpdateState(name string, state string) error { db := common.GetDBConnection() err := db.Model(&App{}).Where("name = ?", name).Updates(App{ State: state, }).Error return err } // Delete removes records about one app from the database func Delete(name string) error { db := common.GetDBConnection() app, err := Get(name) if err != nil { return err } err = db.Where("app_id = ?", app.ID).Delete(&Label{}).Error if err != nil { return err } err = db.Where("id = ?", app.ID).Delete(App{}).Error return err } // AddLabel adds label to existing application func AddLabel(appName string, label string) error { var app App db := common.GetDBConnection() err := db.Where("name = ?", appName).First(&app).Error if err != nil { return err } // Check if there is such label already var count int err = db.Model(&Label{}).Where("value = ? AND app_id = ?", label, app.ID).Count(&count).Error if err != nil { return err } if count > 0 { return nil } // And create the label return db.Create(&Label{AppID: app.ID, Value: label}).Error } // RemoveLabel removes label from existing application func RemoveLabel(appName string, label string) error { var app App db := common.GetDBConnection() err := db.Where("name = ?", appName).First(&app).Error if err != nil { return err } return db.Where("label = ? AND app_id = ?", label, app.ID).Delete(&Label{}).Error }