1
0
mirror of https://github.com/rancher/os.git synced 2025-06-26 15:01:34 +00:00
os/docker/factory.go
2015-05-05 13:36:52 -07:00

103 lines
2.2 KiB
Go

package docker
import (
log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/config"
"github.com/rancherio/os/util"
"github.com/rancherio/rancher-compose/librcompose/project"
)
type ContainerFactory struct {
cfg *config.Config
}
type containerBasedService struct {
name string
project *project.Project
container *Container
serviceConfig *project.ServiceConfig
cfg *config.Config
}
func NewContainerFactory(cfg *config.Config) *ContainerFactory {
return &ContainerFactory{
cfg: cfg,
}
}
func (c *containerBasedService) Up() error {
container := c.container
containerCfg := c.container.ContainerCfg
fakeCreate := false
create := containerCfg.CreateOnly
if util.Contains(c.cfg.Disable, c.name) {
fakeCreate = true
}
var event project.Event
c.project.Notify(project.CONTAINER_STARTING, c.name, map[string]string{})
if fakeCreate {
event = project.CONTAINER_CREATED
} else if create {
container.Create()
event = project.CONTAINER_CREATED
} else {
container.StartAndWait()
event = project.CONTAINER_STARTED
}
if container.Err != nil {
log.Errorf("Failed to run %v: %v", containerCfg.Id, container.Err)
}
if container.Err == nil && containerCfg.ReloadConfig {
return project.ErrRestart
}
if container.Container != nil {
c.project.Notify(event, c.name, map[string]string{
project.CONTAINER_ID: container.Container.ID,
})
}
return container.Err
}
func (c *containerBasedService) Config() *project.ServiceConfig {
return c.serviceConfig
}
func (c *containerBasedService) Name() string {
return c.name
}
func isSystemService(serviceConfig *project.ServiceConfig) bool {
return serviceConfig.Labels.MapParts()[config.SCOPE] == config.SYSTEM
}
func (c *ContainerFactory) Create(project *project.Project, name string, serviceConfig *project.ServiceConfig) (project.Service, error) {
host := config.DOCKER_HOST
if isSystemService(serviceConfig) {
host = config.DOCKER_SYSTEM_HOST
}
container := NewContainerFromService(host, name, serviceConfig)
if container.Err != nil {
return nil, container.Err
}
return &containerBasedService{
name: name,
project: project,
container: container,
serviceConfig: serviceConfig,
cfg: c.cfg,
}, nil
}