Skip to content
Snippets Groups Projects
Commit bc44f425 authored by Florent Gluck's avatar Florent Gluck
Browse files

server:

- optimisation: now passes "nodefaults" to qemu in order to suppress several non-needed backends
- template code optimisation: internally manipulates templates by reference instead of by copy
parent b29fc58b
No related branches found
No related tags found
No related merge requests found
...@@ -78,6 +78,9 @@ func NewQemuSystem(qgaSock string, cpus, ram int, nic string, usbDevs []string, ...@@ -78,6 +78,9 @@ func NewQemuSystem(qgaSock string, cpus, ram int, nic string, usbDevs []string,
// Enable KVM // Enable KVM
args := []string{"-enable-kvm"} args := []string{"-enable-kvm"}
// Suppresses several non-needed backends: serial, parallel, floppy, CD-ROM, SD card, etc.
// More info here: https://gitlab.com/qemu-project/qemu/-/issues/322
args = append(args, "-nodefaults")
// CPU // CPU
args = append(args, "-cpu", "host", "-smp", "cpus="+strconv.Itoa(cpus)) args = append(args, "-cpu", "host", "-smp", "cpus="+strconv.Itoa(cpus))
// RAM // RAM
......
...@@ -41,12 +41,12 @@ func (r *RouterTemplates)GetTemplates(c echo.Context) error { ...@@ -41,12 +41,12 @@ func (r *RouterTemplates)GetTemplates(c echo.Context) error {
// If the logged user has CAP_TPL_LIST_ANY, lists all templates. // If the logged user has CAP_TPL_LIST_ANY, lists all templates.
if user.HasCapability(caps.CAP_TPL_LIST_ANY) { if user.HasCapability(caps.CAP_TPL_LIST_ANY) {
// Returns all templates // Returns all templates
return c.JSONPretty(http.StatusOK, r.tpl.GetNetworkSerializedTemplates(func(t vms.Template) bool { return true }), " ") return c.JSONPretty(http.StatusOK, r.tpl.GetNetworkSerializedTemplates(func(template *vms.Template) bool { return true }), " ")
} else if user.HasCapability(caps.CAP_TPL_LIST) { } else if user.HasCapability(caps.CAP_TPL_LIST) {
// Returns templates owned by the logged user and public templates. // Returns templates owned by the logged user and public templates.
return c.JSONPretty(http.StatusOK, return c.JSONPretty(http.StatusOK,
r.tpl.GetNetworkSerializedTemplates(func(t vms.Template) bool { r.tpl.GetNetworkSerializedTemplates(func(template *vms.Template) bool {
return t.GetOwner() == user.Email || t.IsPublic() return template.GetOwner() == user.Email || template.IsPublic()
}), " ") }), " ")
} else { } else {
return echo.NewHTTPError(http.StatusUnauthorized, msgInsufficientCaps) return echo.NewHTTPError(http.StatusUnauthorized, msgInsufficientCaps)
...@@ -290,19 +290,19 @@ func (r *RouterTemplates)ExportDisk(c echo.Context) error { ...@@ -290,19 +290,19 @@ func (r *RouterTemplates)ExportDisk(c echo.Context) error {
} }
if user.HasCapability(caps.CAP_TPL_READFS_ANY) { if user.HasCapability(caps.CAP_TPL_READFS_ANY) {
t, err := r.tpl.GetTemplate(tplID) template, err := r.tpl.GetTemplate(tplID)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusNotFound, err.Error()) return echo.NewHTTPError(http.StatusNotFound, err.Error())
} }
return c.File(t.GetTemplateDiskPath()) return c.File(template.GetTemplateDiskPath())
} else if user.HasCapability(caps.CAP_TPL_READFS) { } else if user.HasCapability(caps.CAP_TPL_READFS) {
t, err := r.tpl.GetTemplate(tplID) template, err := r.tpl.GetTemplate(tplID)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusNotFound, err.Error()) return echo.NewHTTPError(http.StatusNotFound, err.Error())
} }
if t.IsPublic() || t.GetOwner() == user.Email { if template.IsPublic() || template.GetOwner() == user.Email {
return c.File(t.GetTemplateDiskPath()) return c.File(template.GetTemplateDiskPath())
} }
} }
......
...@@ -27,8 +27,6 @@ const ( ...@@ -27,8 +27,6 @@ const (
templatePrivate = "private" templatePrivate = "private"
) )
var dummyTemplate = Template{}
// Creates a template from a VM's disk. // Creates a template from a VM's disk.
func NewTemplateFromVM(name, owner, access string, vm *VM) (*Template, error) { func NewTemplateFromVM(name, owner, access string, vm *VM) (*Template, error) {
vm.mutex.Lock() vm.mutex.Lock()
...@@ -149,7 +147,7 @@ func (template *Template)SerializeToNetwork() template.TemplateSerialized { ...@@ -149,7 +147,7 @@ func (template *Template)SerializeToNetwork() template.TemplateSerialized {
return template.t return template.t
} }
// Creates a template. // Cr1eates a template.
func newTemplate(name, owner, access string) (*Template, error) { func newTemplate(name, owner, access string) (*Template, error) {
id, err := uuid.NewRandom() id, err := uuid.NewRandom()
if err != nil { if err != nil {
......
...@@ -14,10 +14,10 @@ import( ...@@ -14,10 +14,10 @@ import(
) )
type ( type (
TemplateKeeperFn func(tpl Template) bool TemplateKeeperFn func(tpl *Template) bool
Templates struct { Templates struct {
m map[string]Template m map[string]*Template
dir string // Base directory where templates reside dir string // Base directory where templates reside
rwlock *sync.RWMutex rwlock *sync.RWMutex
} }
...@@ -35,7 +35,7 @@ func GetTemplatesInstance() *Templates { ...@@ -35,7 +35,7 @@ func GetTemplatesInstance() *Templates {
// NOTE: path is the root directory where templates reside. // NOTE: path is the root directory where templates reside.
func InitTemplates() error { func InitTemplates() error {
templatesDir := paths.GetInstance().TemplatesDir templatesDir := paths.GetInstance().TemplatesDir
templates = &Templates { m: make(map[string]Template), dir: templatesDir, rwlock: new(sync.RWMutex) } templates = &Templates { m: make(map[string]*Template), dir: templatesDir, rwlock: new(sync.RWMutex) }
dirs, err := utils.GetSubDirs(templatesDir) dirs, err := utils.GetSubDirs(templatesDir)
if err != nil { if err != nil {
...@@ -64,18 +64,19 @@ func InitTemplates() error { ...@@ -64,18 +64,19 @@ func InitTemplates() error {
continue continue
} }
templates.m[templateDir] = *template templates.m[templateDir] = template
} }
return nil return nil
} }
// Returns the list of templates for which TemplateKeeperFn returns true. // Returns the list of templates for which TemplateKeeperFn returns true.
func (templates *Templates)GetNetworkSerializedTemplates(keep TemplateKeeperFn) []t.TemplateSerialized { func (templates *Templates)GetNetworkSerializedTemplates(keepFn TemplateKeeperFn) []t.TemplateSerialized {
templates.rwlock.RLock() templates.rwlock.RLock()
list := []t.TemplateSerialized{} list := []t.TemplateSerialized{}
for _, tpl := range templates.m { for _, tpl := range templates.m {
if keep(tpl) { if keepFn(tpl) {
list = append(list, tpl.SerializeToNetwork()) list = append(list, tpl.SerializeToNetwork())
} }
} }
...@@ -89,13 +90,13 @@ func (templates *Templates)GetNetworkSerializedTemplates(keep TemplateKeeperFn) ...@@ -89,13 +90,13 @@ func (templates *Templates)GetNetworkSerializedTemplates(keep TemplateKeeperFn)
} }
// Returns a template by its ID. // Returns a template by its ID.
func (templates *Templates)GetTemplate(tplID uuid.UUID) (Template, error) { func (templates *Templates)GetTemplate(tplID uuid.UUID) (*Template, error) {
templates.rwlock.RLock() templates.rwlock.RLock()
defer templates.rwlock.RUnlock() defer templates.rwlock.RUnlock()
template, exists := templates.m[tplID.String()] template, exists := templates.m[tplID.String()]
if !exists { if !exists {
return dummyTemplate, errors.New("Template not found") return nil, errors.New("Template not found")
} }
return template, nil return template, nil
} }
...@@ -136,7 +137,7 @@ func (templates *Templates)AddTemplate(template *Template) error { ...@@ -136,7 +137,7 @@ func (templates *Templates)AddTemplate(template *Template) error {
} }
// Adds template to the map of templates. // Adds template to the map of templates.
templates.m[template.t.ID.String()] = *template templates.m[template.t.ID.String()] = template
return nil return nil
} }
...@@ -149,6 +150,8 @@ func (templates *Templates)EditTemplate(tplID uuid.UUID, name, access string) er ...@@ -149,6 +150,8 @@ func (templates *Templates)EditTemplate(tplID uuid.UUID, name, access string) er
} }
// Only updates fields that have changed. // Only updates fields that have changed.
oriVal := tpl.t // Saves original template values.
if name != "" { if name != "" {
tpl.t.Name = name tpl.t.Name = name
} }
...@@ -157,6 +160,8 @@ func (templates *Templates)EditTemplate(tplID uuid.UUID, name, access string) er ...@@ -157,6 +160,8 @@ func (templates *Templates)EditTemplate(tplID uuid.UUID, name, access string) er
} }
if err = tpl.validate(); err != nil { if err = tpl.validate(); err != nil {
// Restores original template values.
tpl.t = oriVal
return err return err
} }
...@@ -165,10 +170,6 @@ func (templates *Templates)EditTemplate(tplID uuid.UUID, name, access string) er ...@@ -165,10 +170,6 @@ func (templates *Templates)EditTemplate(tplID uuid.UUID, name, access string) er
return err return err
} }
key := tpl.t.ID.String()
delete(templates.m, key)
templates.m[key] = tpl
return nil return nil
} }
......
...@@ -52,8 +52,6 @@ const ( ...@@ -52,8 +52,6 @@ const (
vmQGASockFile = "qga.sock" vmQGASockFile = "qga.sock"
) )
var dummyVM = VM{}
// Custom password generator with the following characters removed: 0, O, l, I // Custom password generator with the following characters removed: 0, O, l, I
var passwordGen, _ = password.NewGenerator(&password.GeneratorInput{ var passwordGen, _ = password.NewGenerator(&password.GeneratorInput{
LowerLetters: "abcdefghijkmnopqrstuvwxyz", LowerLetters: "abcdefghijkmnopqrstuvwxyz",
......
...@@ -120,7 +120,7 @@ func (vms *VMs)GetVM(vmID uuid.UUID) (*VM, error) { ...@@ -120,7 +120,7 @@ func (vms *VMs)GetVM(vmID uuid.UUID) (*VM, error) {
func (vms *VMs)getVMUnsafe(vmID uuid.UUID) (*VM, error) { func (vms *VMs)getVMUnsafe(vmID uuid.UUID) (*VM, error) {
vm, exists := vms.m[vmID.String()] vm, exists := vms.m[vmID.String()]
if !exists { if !exists {
return &dummyVM, errors.New("VM not found") return nil, errors.New("VM not found")
} }
return vm, nil return vm, nil
} }
...@@ -378,7 +378,7 @@ func (vms *VMs)EditVM(vmID uuid.UUID, p *params.VMEdit) error { ...@@ -378,7 +378,7 @@ func (vms *VMs)EditVM(vmID uuid.UUID, p *params.VMEdit) error {
} }
// Only updates fields that have changed. // Only updates fields that have changed.
prevVal := vm.v // Saves previous params values. oriVal := vm.v // Saves original VM values.
if p.Name != "" { if p.Name != "" {
vm.v.Name = p.Name vm.v.Name = p.Name
...@@ -397,8 +397,8 @@ func (vms *VMs)EditVM(vmID uuid.UUID, p *params.VMEdit) error { ...@@ -397,8 +397,8 @@ func (vms *VMs)EditVM(vmID uuid.UUID, p *params.VMEdit) error {
} }
if err = vm.validate(); err != nil { if err = vm.validate(); err != nil {
// Restores previous values. // Restores original VM values.
vm.v = prevVal vm.v = oriVal
return err return err
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment