node-api/apps/main.go
Adam Štrauch 9348504f9e
Final touches
* Possibility to pass token in query param
* More appropriate names for gathering and resource updating functions
* Shorter measuring delay
* Container status available immediatelly when needed
2020-07-26 00:34:16 +02:00

196 lines
3.9 KiB
Go

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() (*[]App, error) {
var apps []App
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
}