Correct logic handling a server resource update
This commit is contained in:
parent
35c1e467cd
commit
c96f22787a
1
go.mod
1
go.mod
|
@ -9,6 +9,7 @@ require (
|
|||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
|
||||
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23
|
||||
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 // indirect
|
||||
github.com/creasty/defaults v1.3.0 // indirect
|
||||
github.com/docker/distribution v2.7.1+incompatible // indirect
|
||||
github.com/docker/docker v0.0.0-20180422163414-57142e89befe
|
||||
github.com/docker/go-connections v0.4.0
|
||||
|
|
2
go.sum
2
go.sum
|
@ -10,6 +10,8 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 h1:D21IyuvjDCshj1
|
|||
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4=
|
||||
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
|
||||
github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw=
|
||||
github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I=
|
||||
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
|
||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v0.0.0-20180422163414-57142e89befe h1:VW8TnWi0CZgg7oCv0wH6evNwkzcJg/emnw4HrVIWws4=
|
||||
|
|
|
@ -696,13 +696,6 @@ func (d *DockerEnvironment) exposedPorts() nat.PortSet {
|
|||
// Formats the resources available to a server instance in such as way that Docker will
|
||||
// generate a matching environment in the container.
|
||||
func (d *DockerEnvironment) getResourcesForServer() container.Resources {
|
||||
b := true
|
||||
oomDisabled := d.Server.Container.OomDisabled
|
||||
|
||||
if oomDisabled == nil {
|
||||
oomDisabled = &b
|
||||
}
|
||||
|
||||
return container.Resources{
|
||||
// @todo memory limit should be slightly higher than the reservation
|
||||
Memory: d.Server.Build.MemoryLimit * 1000000,
|
||||
|
@ -712,6 +705,6 @@ func (d *DockerEnvironment) getResourcesForServer() container.Resources {
|
|||
CPUPeriod: 100000,
|
||||
CPUShares: 1024,
|
||||
BlkioWeight: d.Server.Build.IoWeight,
|
||||
OomKillDisable: oomDisabled,
|
||||
OomKillDisable: &d.Server.Container.OomDisabled,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,16 +46,16 @@ type Server struct {
|
|||
Image string `json:"image,omitempty"`
|
||||
// If set to true, OOM killer will be disabled on the server's Docker container.
|
||||
// If not present (nil) we will default to disabling it.
|
||||
OomDisabled *bool `json:"oom_disabled,omitempty"`
|
||||
OomDisabled bool `default:"false" json:"oom_disabled" yaml:"oom_disabled"`
|
||||
// Defines if the container needs to be rebuilt on the next boot.
|
||||
RebuildRequired bool `json:"rebuild_required,omitempty"`
|
||||
RebuildRequired bool `default:"false" json:"rebuild_required,omitempty" yaml:"rebuild_required"`
|
||||
} `json:"container,omitempty"`
|
||||
|
||||
Environment Environment `json:"-" yaml:"-"`
|
||||
|
||||
Filesystem *Filesystem `json:"-" yaml:"-"`
|
||||
|
||||
Resources *ResourceUsage `json:"resources"`
|
||||
Resources *ResourceUsage `json:"resources" yaml:"-"`
|
||||
|
||||
// Server cache used to store frequently requested information in memory and make
|
||||
// certain long operations return faster. For example, FS disk space usage.
|
||||
|
|
|
@ -2,6 +2,7 @@ package server
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/buger/jsonparser"
|
||||
"github.com/imdario/mergo"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
@ -19,12 +20,30 @@ func (s *Server) UpdateDataStructure(data []byte) error {
|
|||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
// Don't allow obviously corrupted data to pass through into this function. If the UUID
|
||||
// doesn't match something has gone wrong and the API is attempting to meld this server
|
||||
// instance into a totally different one, which would be bad.
|
||||
if src.Uuid != s.Uuid {
|
||||
return errors.New("attempting to merge a data stack with an invalid UUID")
|
||||
}
|
||||
|
||||
// Merge the new data object that we have received with the existing server data object
|
||||
// and then save it to the disk so it is persistent.
|
||||
if err := mergo.Merge(&s, src); err != nil {
|
||||
if err := mergo.Merge(s, src, mergo.WithOverride); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
// Mergo can't quite handle this boolean value correctly, so for now we'll just
|
||||
// handle this edge case manually since none of the other data passed through in this
|
||||
// request is going to be boolean. Allegedly.
|
||||
if v, err := jsonparser.GetBoolean(data, "container", "oom_disabled"); err != nil {
|
||||
if err != jsonparser.KeyPathNotFoundError {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
} else {
|
||||
s.Container.OomDisabled = v
|
||||
}
|
||||
|
||||
s.Container.RebuildRequired = true
|
||||
if _, err := s.WriteConfigurationToDisk(); err != nil {
|
||||
return errors.WithStack(err)
|
||||
|
|
Loading…
Reference in New Issue
Block a user