mirror of https://github.com/docker/cli.git
Allow to set daemon and server configurations in a file.
Read configuration after flags making this the priority: 1- Apply configuration from file. 2- Apply configuration from flags. Reload configuration when a signal is received, USR2 in Linux: - Reload router if the debug configuration changes. - Reload daemon labels. - Reload cluster discovery. Signed-off-by: David Calavera <david.calavera@gmail.com>
This commit is contained in:
parent
e73db35cbf
commit
d611dc46c0
52
opts/opts.go
52
opts/opts.go
|
@ -100,6 +100,35 @@ func (opts *ListOpts) Len() int {
|
||||||
return len((*opts.values))
|
return len((*opts.values))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NamedOption is an interface that list and map options
|
||||||
|
// with names implement.
|
||||||
|
type NamedOption interface {
|
||||||
|
Name() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NamedListOpts is a ListOpts with a configuration name.
|
||||||
|
// This struct is useful to keep reference to the assigned
|
||||||
|
// field name in the internal configuration struct.
|
||||||
|
type NamedListOpts struct {
|
||||||
|
name string
|
||||||
|
ListOpts
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ NamedOption = &NamedListOpts{}
|
||||||
|
|
||||||
|
// NewNamedListOptsRef creates a reference to a new NamedListOpts struct.
|
||||||
|
func NewNamedListOptsRef(name string, values *[]string, validator ValidatorFctType) *NamedListOpts {
|
||||||
|
return &NamedListOpts{
|
||||||
|
name: name,
|
||||||
|
ListOpts: *NewListOptsRef(values, validator),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name returns the name of the NamedListOpts in the configuration.
|
||||||
|
func (o *NamedListOpts) Name() string {
|
||||||
|
return o.name
|
||||||
|
}
|
||||||
|
|
||||||
//MapOpts holds a map of values and a validation function.
|
//MapOpts holds a map of values and a validation function.
|
||||||
type MapOpts struct {
|
type MapOpts struct {
|
||||||
values map[string]string
|
values map[string]string
|
||||||
|
@ -145,6 +174,29 @@ func NewMapOpts(values map[string]string, validator ValidatorFctType) *MapOpts {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NamedMapOpts is a MapOpts struct with a configuration name.
|
||||||
|
// This struct is useful to keep reference to the assigned
|
||||||
|
// field name in the internal configuration struct.
|
||||||
|
type NamedMapOpts struct {
|
||||||
|
name string
|
||||||
|
MapOpts
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ NamedOption = &NamedMapOpts{}
|
||||||
|
|
||||||
|
// NewNamedMapOpts creates a reference to a new NamedMapOpts struct.
|
||||||
|
func NewNamedMapOpts(name string, values map[string]string, validator ValidatorFctType) *NamedMapOpts {
|
||||||
|
return &NamedMapOpts{
|
||||||
|
name: name,
|
||||||
|
MapOpts: *NewMapOpts(values, validator),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name returns the name of the NamedMapOpts in the configuration.
|
||||||
|
func (o *NamedMapOpts) Name() string {
|
||||||
|
return o.name
|
||||||
|
}
|
||||||
|
|
||||||
// ValidatorFctType defines a validator function that returns a validated string and/or an error.
|
// ValidatorFctType defines a validator function that returns a validated string and/or an error.
|
||||||
type ValidatorFctType func(val string) (string, error)
|
type ValidatorFctType func(val string) (string, error)
|
||||||
|
|
||||||
|
|
|
@ -198,3 +198,35 @@ func logOptsValidator(val string) (string, error) {
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("invalid key %s", vals[0])
|
return "", fmt.Errorf("invalid key %s", vals[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNamedListOpts(t *testing.T) {
|
||||||
|
var v []string
|
||||||
|
o := NewNamedListOptsRef("foo-name", &v, nil)
|
||||||
|
|
||||||
|
o.Set("foo")
|
||||||
|
if o.String() != "[foo]" {
|
||||||
|
t.Errorf("%s != [foo]", o.String())
|
||||||
|
}
|
||||||
|
if o.Name() != "foo-name" {
|
||||||
|
t.Errorf("%s != foo-name", o.Name())
|
||||||
|
}
|
||||||
|
if len(v) != 1 {
|
||||||
|
t.Errorf("expected foo to be in the values, got %v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNamedMapOpts(t *testing.T) {
|
||||||
|
tmpMap := make(map[string]string)
|
||||||
|
o := NewNamedMapOpts("max-name", tmpMap, nil)
|
||||||
|
|
||||||
|
o.Set("max-size=1")
|
||||||
|
if o.String() != "map[max-size:1]" {
|
||||||
|
t.Errorf("%s != [map[max-size:1]", o.String())
|
||||||
|
}
|
||||||
|
if o.Name() != "max-name" {
|
||||||
|
t.Errorf("%s != max-name", o.Name())
|
||||||
|
}
|
||||||
|
if _, exist := tmpMap["max-size"]; !exist {
|
||||||
|
t.Errorf("expected map-size to be in the values, got %v", tmpMap)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue