node-api/apps/types.go
2020-07-16 23:24:09 +02:00

89 lines
2.7 KiB
Go

package apps
import (
"regexp"
"strings"
"time"
// This is line from GORM documentation that imports database dialect
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
// ValidationError is error that holds multiple validation error messages
type ValidationError struct {
Errors []string
}
func (v ValidationError) Error() string {
return strings.Join(v.Errors, "\n")
}
// Label holds metadata about the application
type Label struct {
Value string `json:"value"`
AppID uint `json:"-" gorm:"not null"`
}
// AppState contains info about runnint application, it's not saved in the database
type AppState struct {
State string `json:"state"`
CPUUsage float64 `json:"cpu_usage"` // in percents
MemoryUsage int `json:"memory_usage"` // in MB
DiskUsageBytes int `json:"disk_usage_bytes"`
DiskUsageInodes int `json:"disk_usage_inodes"`
}
// App keeps info about hosted application
type App struct {
ID uint `gorm:"primary_key" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt *time.Time `sql:"index" json:"deleted_at"`
Name string `json:"name" gorm:"unique,index,not_null"`
SSHPort int `json:"ssh_port"`
HTTPPort int `json:"http_port"`
Image string `json:"image"`
CPU int `json:"cpu"` // percentage, 200 means two CPU
Memory int `json:"memory"` // Limit in MB
Labels []Label `json:"labels" gorm:"foreignkey:AppID"` // username:cx or user_id:1
State string `json:"state"`
CPUUsage float64 `json:"cpu_usage"` // in percents
MemoryUsage int `json:"memory_usage"` // in MB
DiskUsageBytes int `json:"disk_usage_bytes"`
DiskUsageInodes int `json:"disk_usage_inodes"`
}
// Validate do basic checks of the struct values
func (a *App) Validate() []string {
var errors []string
nameRegExp := regexp.MustCompile(`^[a-z0-9_]{3,48}$`)
if !nameRegExp.MatchString(a.Name) {
errors = append(errors, "name can contain only characters, numbers and underscores and has to be between 3 and 48 characters")
}
if a.SSHPort < 0 && a.SSHPort > 65536 {
errors = append(errors, "SSH port has to be between 0 and 65536, where 0 means disabled")
}
if a.HTTPPort < 1 && a.HTTPPort > 65536 {
errors = append(errors, "HTTP port has to be between 1 and 65536")
}
if a.Image == "" {
errors = append(errors, "image cannot be empty")
}
if a.CPU < 10 && a.CPU > 800 {
errors = append(errors, "CPU value has be between 10 and 800")
}
if a.Memory < 32 && a.Memory > 16384 {
errors = append(errors, "Memory value has be between 32 and 16384")
}
return errors
}