Skip to content

Commit 9e9fc7b

Browse files
author
Aaron Lehmann
committed
Add config support to executor backend
Signed-off-by: Aaron Lehmann <[email protected]>
1 parent a58cc35 commit 9e9fc7b

14 files changed

Lines changed: 207 additions & 49 deletions

container/container.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ type CommonContainer struct {
8787
MountPoints map[string]*volume.MountPoint
8888
HostConfig *containertypes.HostConfig `json:"-"` // do not serialize the host config in the json, otherwise we'll make the container unportable
8989
ExecCommands *exec.Store `json:"-"`
90-
SecretStore agentexec.SecretGetter `json:"-"`
90+
DependencyStore agentexec.DependencyGetter `json:"-"`
9191
SecretReferences []*swarmtypes.SecretReference
92+
ConfigReferences []*swarmtypes.ConfigReference
9293
// logDriver for closing
9394
LogDriver logger.Logger `json:"-"`
9495
LogCopier *logger.Copier `json:"-"`
@@ -966,3 +967,14 @@ func getSecretTargetPath(r *swarmtypes.SecretReference) string {
966967

967968
return filepath.Join(containerSecretMountPath, r.File.Name)
968969
}
970+
971+
// ConfigsDirPath returns the path to the directory where configs are stored on
972+
// disk.
973+
func (container *Container) ConfigsDirPath() string {
974+
return filepath.Join(container.Root, "configs")
975+
}
976+
977+
// ConfigFilePath returns the path to the on-disk location of a config.
978+
func (container *Container) ConfigFilePath(configRef swarmtypes.ConfigReference) string {
979+
return filepath.Join(container.ConfigsDirPath(), configRef.ConfigID)
980+
}

container/container_unix.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,23 @@ func (container *Container) UnmountSecrets() error {
277277
return detachMounted(container.SecretMountPath())
278278
}
279279

280+
// ConfigMounts returns the mounts for configs.
281+
func (container *Container) ConfigMounts() []Mount {
282+
var mounts []Mount
283+
for _, configRef := range container.ConfigReferences {
284+
if configRef.File == nil {
285+
continue
286+
}
287+
mounts = append(mounts, Mount{
288+
Source: container.ConfigFilePath(*configRef),
289+
Destination: configRef.File.Name,
290+
Writable: false,
291+
})
292+
}
293+
294+
return mounts
295+
}
296+
280297
// UpdateContainer updates configuration of a container.
281298
func (container *Container) UpdateContainer(hostConfig *containertypes.HostConfig) error {
282299
container.Lock()

daemon/cluster/executor/backend.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ type Backend interface {
4242
ContainerWaitWithContext(ctx context.Context, name string) error
4343
ContainerRm(name string, config *types.ContainerRmConfig) error
4444
ContainerKill(name string, sig uint64) error
45-
SetContainerSecretStore(name string, store exec.SecretGetter) error
45+
SetContainerDependencyStore(name string, store exec.DependencyGetter) error
4646
SetContainerSecretReferences(name string, refs []*swarmtypes.SecretReference) error
47+
SetContainerConfigReferences(name string, refs []*swarmtypes.ConfigReference) error
4748
SystemInfo() (*types.Info, error)
4849
VolumeCreate(name, driverName string, opts, labels map[string]string) (*types.Volume, error)
4950
Containers(config *types.ContainerListOptions) ([]*types.Container, error)

daemon/cluster/executor/container/adapter.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,21 @@ import (
3333
// are mostly naked calls to the client API, seeded with information from
3434
// containerConfig.
3535
type containerAdapter struct {
36-
backend executorpkg.Backend
37-
container *containerConfig
38-
secrets exec.SecretGetter
36+
backend executorpkg.Backend
37+
container *containerConfig
38+
dependencies exec.DependencyGetter
3939
}
4040

41-
func newContainerAdapter(b executorpkg.Backend, task *api.Task, secrets exec.SecretGetter) (*containerAdapter, error) {
41+
func newContainerAdapter(b executorpkg.Backend, task *api.Task, dependencies exec.DependencyGetter) (*containerAdapter, error) {
4242
ctnr, err := newContainerConfig(task)
4343
if err != nil {
4444
return nil, err
4545
}
4646

4747
return &containerAdapter{
48-
container: ctnr,
49-
backend: b,
50-
secrets: secrets,
48+
container: ctnr,
49+
backend: b,
50+
dependencies: dependencies,
5151
}, nil
5252
}
5353

@@ -243,13 +243,18 @@ func (c *containerAdapter) create(ctx context.Context) error {
243243
return errors.New("unable to get container from task spec")
244244
}
245245

246+
if err := c.backend.SetContainerDependencyStore(cr.ID, c.dependencies); err != nil {
247+
return err
248+
}
249+
246250
// configure secrets
247-
if err := c.backend.SetContainerSecretStore(cr.ID, c.secrets); err != nil {
251+
secretRefs := convert.SecretReferencesFromGRPC(container.Secrets)
252+
if err := c.backend.SetContainerSecretReferences(cr.ID, secretRefs); err != nil {
248253
return err
249254
}
250255

251-
refs := convert.SecretReferencesFromGRPC(container.Secrets)
252-
if err := c.backend.SetContainerSecretReferences(cr.ID, refs); err != nil {
256+
configRefs := convert.ConfigReferencesFromGRPC(container.Configs)
257+
if err := c.backend.SetContainerConfigReferences(cr.ID, configRefs); err != nil {
253258
return err
254259
}
255260

daemon/cluster/executor/container/attachment.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ type networkAttacherController struct {
2020
closed chan struct{}
2121
}
2222

23-
func newNetworkAttacherController(b executorpkg.Backend, task *api.Task, secrets exec.SecretGetter) (*networkAttacherController, error) {
24-
adapter, err := newContainerAdapter(b, task, secrets)
23+
func newNetworkAttacherController(b executorpkg.Backend, task *api.Task, dependencies exec.DependencyGetter) (*networkAttacherController, error) {
24+
adapter, err := newContainerAdapter(b, task, dependencies)
2525
if err != nil {
2626
return nil, err
2727
}

daemon/cluster/executor/container/controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ type controller struct {
3939
var _ exec.Controller = &controller{}
4040

4141
// NewController returns a docker exec runner for the provided task.
42-
func newController(b executorpkg.Backend, task *api.Task, secrets exec.SecretGetter) (*controller, error) {
43-
adapter, err := newContainerAdapter(b, task, secrets)
42+
func newController(b executorpkg.Backend, task *api.Task, dependencies exec.DependencyGetter) (*controller, error) {
43+
adapter, err := newContainerAdapter(b, task, dependencies)
4444
if err != nil {
4545
return nil, err
4646
}

daemon/cluster/executor/container/executor.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@ import (
1414
executorpkg "github.com/docker/docker/daemon/cluster/executor"
1515
clustertypes "github.com/docker/docker/daemon/cluster/provider"
1616
networktypes "github.com/docker/libnetwork/types"
17+
"github.com/docker/swarmkit/agent"
1718
"github.com/docker/swarmkit/agent/exec"
18-
"github.com/docker/swarmkit/agent/secrets"
1919
"github.com/docker/swarmkit/api"
2020
"github.com/docker/swarmkit/api/naming"
2121
"golang.org/x/net/context"
2222
)
2323

2424
type executor struct {
25-
backend executorpkg.Backend
26-
secrets exec.SecretsManager
25+
backend executorpkg.Backend
26+
dependencies exec.DependencyManager
2727
}
2828

2929
// NewExecutor returns an executor from the docker client.
3030
func NewExecutor(b executorpkg.Backend) exec.Executor {
3131
return &executor{
32-
backend: b,
33-
secrets: secrets.NewManager(),
32+
backend: b,
33+
dependencies: agent.NewDependencyManager(),
3434
}
3535
}
3636

@@ -162,8 +162,10 @@ func (e *executor) Configure(ctx context.Context, node *api.Node) error {
162162

163163
// Controller returns a docker container runner.
164164
func (e *executor) Controller(t *api.Task) (exec.Controller, error) {
165+
dependencyGetter := agent.Restrict(e.dependencies, t)
166+
165167
if t.Spec.GetAttachment() != nil {
166-
return newNetworkAttacherController(e.backend, t, e.secrets)
168+
return newNetworkAttacherController(e.backend, t, dependencyGetter)
167169
}
168170

169171
var ctlr exec.Controller
@@ -188,7 +190,7 @@ func (e *executor) Controller(t *api.Task) (exec.Controller, error) {
188190
return ctlr, fmt.Errorf("unsupported runtime type: %q", r.Generic.Kind)
189191
}
190192
case *api.TaskSpec_Container:
191-
c, err := newController(e.backend, t, secrets.Restrict(e.secrets, t))
193+
c, err := newController(e.backend, t, dependencyGetter)
192194
if err != nil {
193195
return ctlr, err
194196
}
@@ -218,7 +220,11 @@ func (e *executor) SetNetworkBootstrapKeys(keys []*api.EncryptionKey) error {
218220
}
219221

220222
func (e *executor) Secrets() exec.SecretsManager {
221-
return e.secrets
223+
return e.dependencies.Secrets()
224+
}
225+
226+
func (e *executor) Configs() exec.ConfigsManager {
227+
return e.dependencies.Configs()
222228
}
223229

224230
type sortedPlugins []api.PluginDescription

daemon/configs.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package daemon
2+
3+
import (
4+
"github.com/Sirupsen/logrus"
5+
swarmtypes "github.com/docker/docker/api/types/swarm"
6+
)
7+
8+
// SetContainerConfigReferences sets the container config references needed
9+
func (daemon *Daemon) SetContainerConfigReferences(name string, refs []*swarmtypes.ConfigReference) error {
10+
if !configsSupported() && len(refs) > 0 {
11+
logrus.Warn("configs are not supported on this platform")
12+
return nil
13+
}
14+
15+
c, err := daemon.GetContainer(name)
16+
if err != nil {
17+
return err
18+
}
19+
20+
c.ConfigReferences = refs
21+
22+
return nil
23+
}

daemon/configs_linux.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// +build linux
2+
3+
package daemon
4+
5+
func configsSupported() bool {
6+
return true
7+
}

daemon/configs_unsupported.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// +build !linux
2+
3+
package daemon
4+
5+
func configsSupported() bool {
6+
return false
7+
}

0 commit comments

Comments
 (0)