dotcloud/docker

View on GitHub
plugin/defs.go

Summary

Maintainability
A
0 mins
Test Coverage
package plugin // import "github.com/docker/docker/plugin"

import (
    "strings"
    "sync"

    "github.com/docker/docker/pkg/plugins"
    v2 "github.com/docker/docker/plugin/v2"
    specs "github.com/opencontainers/runtime-spec/specs-go"
)

// Store manages the plugin inventory in memory and on-disk
type Store struct {
    sync.RWMutex
    plugins  map[string]*v2.Plugin
    specOpts map[string][]SpecOpt
    /* handlers are necessary for transition path of legacy plugins
     * to the new model. Legacy plugins use Handle() for registering an
     * activation callback.*/
    handlers map[string][]func(string, *plugins.Client)
}

// NewStore creates a Store.
func NewStore() *Store {
    return &Store{
        plugins:  make(map[string]*v2.Plugin),
        specOpts: make(map[string][]SpecOpt),
        handlers: make(map[string][]func(string, *plugins.Client)),
    }
}

// SpecOpt is used for subsystems that need to modify the runtime spec of a plugin
type SpecOpt func(*specs.Spec)

// CreateOpt is used to configure specific plugin details when created
type CreateOpt func(p *v2.Plugin)

// WithSwarmService is a CreateOpt that flags the passed in a plugin as a plugin
// managed by swarm
func WithSwarmService(id string) CreateOpt {
    return func(p *v2.Plugin) {
        p.SwarmServiceID = id
    }
}

// WithEnv is a CreateOpt that passes the user-provided environment variables
// to the plugin container, de-duplicating variables with the same names case
// sensitively and only appends valid key=value pairs
func WithEnv(env []string) CreateOpt {
    return func(p *v2.Plugin) {
        effectiveEnv := make(map[string]string)
        for _, penv := range p.PluginObj.Config.Env {
            if penv.Value != nil {
                effectiveEnv[penv.Name] = *penv.Value
            }
        }
        for _, line := range env {
            if k, v, ok := strings.Cut(line, "="); ok {
                effectiveEnv[k] = v
            }
        }
        p.PluginObj.Settings.Env = make([]string, 0, len(effectiveEnv))
        for key, value := range effectiveEnv {
            p.PluginObj.Settings.Env = append(p.PluginObj.Settings.Env, key+"="+value)
        }
    }
}

// WithSpecMounts is a SpecOpt which appends the provided mounts to the runtime spec
func WithSpecMounts(mounts []specs.Mount) SpecOpt {
    return func(s *specs.Spec) {
        s.Mounts = append(s.Mounts, mounts...)
    }
}