b7daa2f3a4
Update traefik dependencies (docker/docker and related) - Update dependencies - Fix compilation problems - Remove vdemeester/docker-events (in docker api now) - Remove `integration/vendor` - Use `testImport` - update some deps. - regenerate the lock from scratch (after a `glide cc`)
265 lines
11 KiB
Go
265 lines
11 KiB
Go
package config
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/docker/libcompose/yaml"
|
|
)
|
|
|
|
// EnvironmentLookup defines methods to provides environment variable loading.
|
|
type EnvironmentLookup interface {
|
|
Lookup(key string, config *ServiceConfig) []string
|
|
}
|
|
|
|
// ResourceLookup defines methods to provides file loading.
|
|
type ResourceLookup interface {
|
|
Lookup(file, relativeTo string) ([]byte, string, error)
|
|
ResolvePath(path, inFile string) string
|
|
}
|
|
|
|
// ServiceConfigV1 holds version 1 of libcompose service configuration
|
|
type ServiceConfigV1 struct {
|
|
Build string `yaml:"build,omitempty"`
|
|
CapAdd []string `yaml:"cap_add,omitempty"`
|
|
CapDrop []string `yaml:"cap_drop,omitempty"`
|
|
CgroupParent string `yaml:"cgroup_parent,omitempty"`
|
|
CPUQuota yaml.StringorInt `yaml:"cpu_quota,omitempty"`
|
|
CPUSet string `yaml:"cpuset,omitempty"`
|
|
CPUShares yaml.StringorInt `yaml:"cpu_shares,omitempty"`
|
|
Command yaml.Command `yaml:"command,flow,omitempty"`
|
|
ContainerName string `yaml:"container_name,omitempty"`
|
|
Devices []string `yaml:"devices,omitempty"`
|
|
DNS yaml.Stringorslice `yaml:"dns,omitempty"`
|
|
DNSOpts []string `yaml:"dns_opt,omitempty"`
|
|
DNSSearch yaml.Stringorslice `yaml:"dns_search,omitempty"`
|
|
Dockerfile string `yaml:"dockerfile,omitempty"`
|
|
DomainName string `yaml:"domainname,omitempty"`
|
|
Entrypoint yaml.Command `yaml:"entrypoint,flow,omitempty"`
|
|
EnvFile yaml.Stringorslice `yaml:"env_file,omitempty"`
|
|
Environment yaml.MaporEqualSlice `yaml:"environment,omitempty"`
|
|
GroupAdd []string `yaml:"group_add,omitempty"`
|
|
Hostname string `yaml:"hostname,omitempty"`
|
|
Image string `yaml:"image,omitempty"`
|
|
Isolation string `yaml:"isolation,omitempty"`
|
|
Labels yaml.SliceorMap `yaml:"labels,omitempty"`
|
|
Links yaml.MaporColonSlice `yaml:"links,omitempty"`
|
|
LogDriver string `yaml:"log_driver,omitempty"`
|
|
MacAddress string `yaml:"mac_address,omitempty"`
|
|
MemLimit yaml.MemStringorInt `yaml:"mem_limit,omitempty"`
|
|
MemSwapLimit yaml.MemStringorInt `yaml:"memswap_limit,omitempty"`
|
|
MemSwappiness yaml.MemStringorInt `yaml:"mem_swappiness,omitempty"`
|
|
Name string `yaml:"name,omitempty"`
|
|
Net string `yaml:"net,omitempty"`
|
|
OomKillDisable bool `yaml:"oom_kill_disable,omitempty"`
|
|
OomScoreAdj yaml.StringorInt `yaml:"oom_score_adj,omitempty"`
|
|
Pid string `yaml:"pid,omitempty"`
|
|
Uts string `yaml:"uts,omitempty"`
|
|
Ipc string `yaml:"ipc,omitempty"`
|
|
Ports []string `yaml:"ports,omitempty"`
|
|
Privileged bool `yaml:"privileged,omitempty"`
|
|
Restart string `yaml:"restart,omitempty"`
|
|
ReadOnly bool `yaml:"read_only,omitempty"`
|
|
ShmSize yaml.MemStringorInt `yaml:"shm_size,omitempty"`
|
|
StdinOpen bool `yaml:"stdin_open,omitempty"`
|
|
SecurityOpt []string `yaml:"security_opt,omitempty"`
|
|
StopSignal string `yaml:"stop_signal,omitempty"`
|
|
Tmpfs yaml.Stringorslice `yaml:"tmpfs,omitempty"`
|
|
Tty bool `yaml:"tty,omitempty"`
|
|
User string `yaml:"user,omitempty"`
|
|
VolumeDriver string `yaml:"volume_driver,omitempty"`
|
|
Volumes []string `yaml:"volumes,omitempty"`
|
|
VolumesFrom []string `yaml:"volumes_from,omitempty"`
|
|
WorkingDir string `yaml:"working_dir,omitempty"`
|
|
Expose []string `yaml:"expose,omitempty"`
|
|
ExternalLinks []string `yaml:"external_links,omitempty"`
|
|
LogOpt map[string]string `yaml:"log_opt,omitempty"`
|
|
ExtraHosts []string `yaml:"extra_hosts,omitempty"`
|
|
Ulimits yaml.Ulimits `yaml:"ulimits,omitempty"`
|
|
}
|
|
|
|
// Log holds v2 logging information
|
|
type Log struct {
|
|
Driver string `yaml:"driver,omitempty"`
|
|
Options map[string]string `yaml:"options,omitempty"`
|
|
}
|
|
|
|
// ServiceConfig holds version 2 of libcompose service configuration
|
|
type ServiceConfig struct {
|
|
Build yaml.Build `yaml:"build,omitempty"`
|
|
CapAdd []string `yaml:"cap_add,omitempty"`
|
|
CapDrop []string `yaml:"cap_drop,omitempty"`
|
|
CPUSet string `yaml:"cpuset,omitempty"`
|
|
CPUShares yaml.StringorInt `yaml:"cpu_shares,omitempty"`
|
|
CPUQuota yaml.StringorInt `yaml:"cpu_quota,omitempty"`
|
|
Command yaml.Command `yaml:"command,flow,omitempty"`
|
|
CgroupParent string `yaml:"cgroup_parent,omitempty"`
|
|
ContainerName string `yaml:"container_name,omitempty"`
|
|
Devices []string `yaml:"devices,omitempty"`
|
|
DependsOn []string `yaml:"depends_on,omitempty"`
|
|
DNS yaml.Stringorslice `yaml:"dns,omitempty"`
|
|
DNSOpts []string `yaml:"dns_opt,omitempty"`
|
|
DNSSearch yaml.Stringorslice `yaml:"dns_search,omitempty"`
|
|
DomainName string `yaml:"domainname,omitempty"`
|
|
Entrypoint yaml.Command `yaml:"entrypoint,flow,omitempty"`
|
|
EnvFile yaml.Stringorslice `yaml:"env_file,omitempty"`
|
|
Environment yaml.MaporEqualSlice `yaml:"environment,omitempty"`
|
|
Expose []string `yaml:"expose,omitempty"`
|
|
Extends yaml.MaporEqualSlice `yaml:"extends,omitempty"`
|
|
ExternalLinks []string `yaml:"external_links,omitempty"`
|
|
ExtraHosts []string `yaml:"extra_hosts,omitempty"`
|
|
GroupAdd []string `yaml:"group_add,omitempty"`
|
|
Image string `yaml:"image,omitempty"`
|
|
Isolation string `yaml:"isolation,omitempty"`
|
|
Hostname string `yaml:"hostname,omitempty"`
|
|
Ipc string `yaml:"ipc,omitempty"`
|
|
Labels yaml.SliceorMap `yaml:"labels,omitempty"`
|
|
Links yaml.MaporColonSlice `yaml:"links,omitempty"`
|
|
Logging Log `yaml:"logging,omitempty"`
|
|
MacAddress string `yaml:"mac_address,omitempty"`
|
|
MemLimit yaml.MemStringorInt `yaml:"mem_limit,omitempty"`
|
|
MemReservation yaml.MemStringorInt `yaml:"mem_reservation,omitempty"`
|
|
MemSwapLimit yaml.MemStringorInt `yaml:"memswap_limit,omitempty"`
|
|
MemSwappiness yaml.MemStringorInt `yaml:"mem_swappiness,omitempty"`
|
|
NetworkMode string `yaml:"network_mode,omitempty"`
|
|
Networks *yaml.Networks `yaml:"networks,omitempty"`
|
|
OomKillDisable bool `yaml:"oom_kill_disable,omitempty"`
|
|
OomScoreAdj yaml.StringorInt `yaml:"oom_score_adj,omitempty"`
|
|
Pid string `yaml:"pid,omitempty"`
|
|
Ports []string `yaml:"ports,omitempty"`
|
|
Privileged bool `yaml:"privileged,omitempty"`
|
|
SecurityOpt []string `yaml:"security_opt,omitempty"`
|
|
ShmSize yaml.MemStringorInt `yaml:"shm_size,omitempty"`
|
|
StopGracePeriod string `yaml:"stop_grace_period,omitempty"`
|
|
StopSignal string `yaml:"stop_signal,omitempty"`
|
|
Tmpfs yaml.Stringorslice `yaml:"tmpfs,omitempty"`
|
|
VolumeDriver string `yaml:"volume_driver,omitempty"`
|
|
Volumes *yaml.Volumes `yaml:"volumes,omitempty"`
|
|
VolumesFrom []string `yaml:"volumes_from,omitempty"`
|
|
Uts string `yaml:"uts,omitempty"`
|
|
Restart string `yaml:"restart,omitempty"`
|
|
ReadOnly bool `yaml:"read_only,omitempty"`
|
|
StdinOpen bool `yaml:"stdin_open,omitempty"`
|
|
Tty bool `yaml:"tty,omitempty"`
|
|
User string `yaml:"user,omitempty"`
|
|
WorkingDir string `yaml:"working_dir,omitempty"`
|
|
Ulimits yaml.Ulimits `yaml:"ulimits,omitempty"`
|
|
}
|
|
|
|
// VolumeConfig holds v2 volume configuration
|
|
type VolumeConfig struct {
|
|
Driver string `yaml:"driver,omitempty"`
|
|
DriverOpts map[string]string `yaml:"driver_opts,omitempty"`
|
|
External yaml.External `yaml:"external,omitempty"`
|
|
}
|
|
|
|
// Ipam holds v2 network IPAM information
|
|
type Ipam struct {
|
|
Driver string `yaml:"driver,omitempty"`
|
|
Config []IpamConfig `yaml:"config,omitempty"`
|
|
}
|
|
|
|
// IpamConfig holds v2 network IPAM configuration information
|
|
type IpamConfig struct {
|
|
Subnet string `yaml:"subnet,omitempty"`
|
|
IPRange string `yaml:"ip_range,omitempty"`
|
|
Gateway string `yaml:"gateway,omitempty"`
|
|
AuxAddress map[string]string `yaml:"aux_addresses,omitempty"`
|
|
}
|
|
|
|
// NetworkConfig holds v2 network configuration
|
|
type NetworkConfig struct {
|
|
Driver string `yaml:"driver,omitempty"`
|
|
DriverOpts map[string]string `yaml:"driver_opts,omitempty"`
|
|
External yaml.External `yaml:"external,omitempty"`
|
|
Ipam Ipam `yaml:"ipam,omitempty"`
|
|
}
|
|
|
|
// Config holds libcompose top level configuration
|
|
type Config struct {
|
|
Version string `yaml:"version,omitempty"`
|
|
Services RawServiceMap `yaml:"services,omitempty"`
|
|
Volumes map[string]interface{} `yaml:"volumes,omitempty"`
|
|
Networks map[string]interface{} `yaml:"networks,omitempty"`
|
|
}
|
|
|
|
// NewServiceConfigs initializes a new Configs struct
|
|
func NewServiceConfigs() *ServiceConfigs {
|
|
return &ServiceConfigs{
|
|
m: make(map[string]*ServiceConfig),
|
|
}
|
|
}
|
|
|
|
// ServiceConfigs holds a concurrent safe map of ServiceConfig
|
|
type ServiceConfigs struct {
|
|
m map[string]*ServiceConfig
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// Has checks if the config map has the specified name
|
|
func (c *ServiceConfigs) Has(name string) bool {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
_, ok := c.m[name]
|
|
return ok
|
|
}
|
|
|
|
// Get returns the config and the presence of the specified name
|
|
func (c *ServiceConfigs) Get(name string) (*ServiceConfig, bool) {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
service, ok := c.m[name]
|
|
return service, ok
|
|
}
|
|
|
|
// Add add the specifed config with the specified name
|
|
func (c *ServiceConfigs) Add(name string, service *ServiceConfig) {
|
|
c.mu.Lock()
|
|
c.m[name] = service
|
|
c.mu.Unlock()
|
|
}
|
|
|
|
// Remove removes the config with the specified name
|
|
func (c *ServiceConfigs) Remove(name string) {
|
|
c.mu.Lock()
|
|
delete(c.m, name)
|
|
c.mu.Unlock()
|
|
}
|
|
|
|
// Len returns the len of the configs
|
|
func (c *ServiceConfigs) Len() int {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
return len(c.m)
|
|
}
|
|
|
|
// Keys returns the names of the config
|
|
func (c *ServiceConfigs) Keys() []string {
|
|
keys := []string{}
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
for name := range c.m {
|
|
keys = append(keys, name)
|
|
}
|
|
return keys
|
|
}
|
|
|
|
// All returns all the config at once
|
|
func (c *ServiceConfigs) All() map[string]*ServiceConfig {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
return c.m
|
|
}
|
|
|
|
// RawService is represent a Service in map form unparsed
|
|
type RawService map[string]interface{}
|
|
|
|
// RawServiceMap is a collection of RawServices
|
|
type RawServiceMap map[string]RawService
|
|
|
|
// ParseOptions are a set of options to customize the parsing process
|
|
type ParseOptions struct {
|
|
Interpolate bool
|
|
Validate bool
|
|
Preprocess func(RawServiceMap) (RawServiceMap, error)
|
|
Postprocess func(map[string]*ServiceConfig) (map[string]*ServiceConfig, error)
|
|
}
|