mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #24476 from stevvooe/services-log-driver-support
swarm: add log driver support for services
This commit is contained in:
commit
1796680381
4 changed files with 84 additions and 0 deletions
|
@ -358,6 +358,27 @@ func convertPortToPortConfig(
|
||||||
return ports
|
return ports
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type logDriverOptions struct {
|
||||||
|
name string
|
||||||
|
opts opts.ListOpts
|
||||||
|
}
|
||||||
|
|
||||||
|
func newLogDriverOptions() logDriverOptions {
|
||||||
|
return logDriverOptions{opts: opts.NewListOpts(runconfigopts.ValidateEnv)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ldo *logDriverOptions) toLogDriver() *swarm.Driver {
|
||||||
|
if ldo.name == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the log driver only if specified.
|
||||||
|
return &swarm.Driver{
|
||||||
|
Name: ldo.name,
|
||||||
|
Options: runconfigopts.ConvertKVStringsToMap(ldo.opts.GetAll()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ValidatePort validates a string is in the expected format for a port definition
|
// ValidatePort validates a string is in the expected format for a port definition
|
||||||
func ValidatePort(value string) (string, error) {
|
func ValidatePort(value string) (string, error) {
|
||||||
portMappings, err := nat.ParsePortSpec(value)
|
portMappings, err := nat.ParsePortSpec(value)
|
||||||
|
@ -392,6 +413,8 @@ type serviceOptions struct {
|
||||||
endpoint endpointOptions
|
endpoint endpointOptions
|
||||||
|
|
||||||
registryAuth bool
|
registryAuth bool
|
||||||
|
|
||||||
|
logDriver logDriverOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
func newServiceOptions() *serviceOptions {
|
func newServiceOptions() *serviceOptions {
|
||||||
|
@ -401,6 +424,7 @@ func newServiceOptions() *serviceOptions {
|
||||||
endpoint: endpointOptions{
|
endpoint: endpointOptions{
|
||||||
ports: opts.NewListOpts(ValidatePort),
|
ports: opts.NewListOpts(ValidatePort),
|
||||||
},
|
},
|
||||||
|
logDriver: newLogDriverOptions(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,6 +451,7 @@ func (opts *serviceOptions) ToService() (swarm.ServiceSpec, error) {
|
||||||
Placement: &swarm.Placement{
|
Placement: &swarm.Placement{
|
||||||
Constraints: opts.constraints,
|
Constraints: opts.constraints,
|
||||||
},
|
},
|
||||||
|
LogDriver: opts.logDriver.toLogDriver(),
|
||||||
},
|
},
|
||||||
Mode: swarm.ServiceMode{},
|
Mode: swarm.ServiceMode{},
|
||||||
UpdateConfig: &swarm.UpdateConfig{
|
UpdateConfig: &swarm.UpdateConfig{
|
||||||
|
@ -482,6 +507,9 @@ func addServiceFlags(cmd *cobra.Command, opts *serviceOptions) {
|
||||||
flags.StringVar(&opts.endpoint.mode, flagEndpointMode, "", "Endpoint mode (vip or dnsrr)")
|
flags.StringVar(&opts.endpoint.mode, flagEndpointMode, "", "Endpoint mode (vip or dnsrr)")
|
||||||
|
|
||||||
flags.BoolVar(&opts.registryAuth, flagRegistryAuth, false, "Send registry authentication details to Swarm agents")
|
flags.BoolVar(&opts.registryAuth, flagRegistryAuth, false, "Send registry authentication details to Swarm agents")
|
||||||
|
|
||||||
|
flags.StringVar(&opts.logDriver.name, flagLogDriver, "", "Logging driver for service")
|
||||||
|
flags.Var(&opts.logDriver.opts, flagLogOpt, "Logging driver options")
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -520,4 +548,6 @@ const (
|
||||||
flagUpdateParallelism = "update-parallelism"
|
flagUpdateParallelism = "update-parallelism"
|
||||||
flagUser = "user"
|
flagUser = "user"
|
||||||
flagRegistryAuth = "registry-auth"
|
flagRegistryAuth = "registry-auth"
|
||||||
|
flagLogDriver = "log-driver"
|
||||||
|
flagLogOpt = "log-opt"
|
||||||
)
|
)
|
||||||
|
|
|
@ -211,6 +211,11 @@ func updateService(flags *pflag.FlagSet, spec *swarm.ServiceSpec) error {
|
||||||
}
|
}
|
||||||
updatePorts(flags, &spec.EndpointSpec.Ports)
|
updatePorts(flags, &spec.EndpointSpec.Ports)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := updateLogDriver(flags, &spec.TaskTemplate); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,3 +391,27 @@ func updateReplicas(flags *pflag.FlagSet, serviceMode *swarm.ServiceMode) error
|
||||||
serviceMode.Replicated.Replicas = flags.Lookup(flagReplicas).Value.(*Uint64Opt).Value()
|
serviceMode.Replicated.Replicas = flags.Lookup(flagReplicas).Value.(*Uint64Opt).Value()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// updateLogDriver updates the log driver only if the log driver flag is set.
|
||||||
|
// All options will be replaced with those provided on the command line.
|
||||||
|
func updateLogDriver(flags *pflag.FlagSet, taskTemplate *swarm.TaskSpec) error {
|
||||||
|
if !flags.Changed(flagLogDriver) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
name, err := flags.GetString(flagLogDriver)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if name == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
taskTemplate.LogDriver = &swarm.Driver{
|
||||||
|
Name: name,
|
||||||
|
Options: runconfigopts.ConvertKVStringsToMap(flags.Lookup(flagLogOpt).Value.(*opts.ListOpts).GetAll()),
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ func ServiceFromGRPC(s swarmapi.Service) types.Service {
|
||||||
Resources: resourcesFromGRPC(s.Spec.Task.Resources),
|
Resources: resourcesFromGRPC(s.Spec.Task.Resources),
|
||||||
RestartPolicy: restartPolicyFromGRPC(s.Spec.Task.Restart),
|
RestartPolicy: restartPolicyFromGRPC(s.Spec.Task.Restart),
|
||||||
Placement: placementFromGRPC(s.Spec.Task.Placement),
|
Placement: placementFromGRPC(s.Spec.Task.Placement),
|
||||||
|
LogDriver: driverFromGRPC(s.Spec.Task.LogDriver),
|
||||||
},
|
},
|
||||||
|
|
||||||
Networks: networks,
|
Networks: networks,
|
||||||
|
@ -86,6 +87,7 @@ func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) {
|
||||||
},
|
},
|
||||||
Task: swarmapi.TaskSpec{
|
Task: swarmapi.TaskSpec{
|
||||||
Resources: resourcesToGRPC(s.TaskTemplate.Resources),
|
Resources: resourcesToGRPC(s.TaskTemplate.Resources),
|
||||||
|
LogDriver: driverToGRPC(s.TaskTemplate.LogDriver),
|
||||||
},
|
},
|
||||||
Networks: networks,
|
Networks: networks,
|
||||||
}
|
}
|
||||||
|
@ -251,3 +253,25 @@ func placementFromGRPC(p *swarmapi.Placement) *types.Placement {
|
||||||
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func driverFromGRPC(p *swarmapi.Driver) *types.Driver {
|
||||||
|
if p == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.Driver{
|
||||||
|
Name: p.Name,
|
||||||
|
Options: p.Options,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func driverToGRPC(p *types.Driver) *swarmapi.Driver {
|
||||||
|
if p == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &swarmapi.Driver{
|
||||||
|
Name: p.Name,
|
||||||
|
Options: p.Options,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ func TaskFromGRPC(t swarmapi.Task) types.Task {
|
||||||
Resources: resourcesFromGRPC(t.Spec.Resources),
|
Resources: resourcesFromGRPC(t.Spec.Resources),
|
||||||
RestartPolicy: restartPolicyFromGRPC(t.Spec.Restart),
|
RestartPolicy: restartPolicyFromGRPC(t.Spec.Restart),
|
||||||
Placement: placementFromGRPC(t.Spec.Placement),
|
Placement: placementFromGRPC(t.Spec.Placement),
|
||||||
|
LogDriver: driverFromGRPC(t.Spec.LogDriver),
|
||||||
},
|
},
|
||||||
Status: types.TaskStatus{
|
Status: types.TaskStatus{
|
||||||
State: types.TaskState(strings.ToLower(t.Status.State.String())),
|
State: types.TaskState(strings.ToLower(t.Status.State.String())),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue