From 04472c7552733ad31a8ebad58d238455c9f184b5 Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Wed, 26 Aug 2015 14:48:19 +0500 Subject: [PATCH] Do not link to services that do not exist in the project Fixes #495 --- docker/service.go | 17 +++++++++++------ docker/service_factory.go | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/docker/service.go b/docker/service.go index 62cb8204..0930a327 100644 --- a/docker/service.go +++ b/docker/service.go @@ -14,32 +14,34 @@ type Service struct { *docker.Service deps map[string][]string context *docker.Context + project *project.Project } -func NewService(factory *ServiceFactory, name string, serviceConfig *project.ServiceConfig, context *docker.Context) *Service { +func NewService(factory *ServiceFactory, name string, serviceConfig *project.ServiceConfig, context *docker.Context, project *project.Project) *Service { return &Service{ Service: docker.NewService(name, serviceConfig, context), deps: factory.Deps, context: context, + project: project, } } func (s *Service) DependentServices() []project.ServiceRelationship { rels := s.Service.DependentServices() for _, dep := range s.deps[s.Name()] { - rels = appendLink(rels, dep, true) + rels = appendLink(rels, dep, true, s.project) } if s.requiresSyslog() { - rels = appendLink(rels, "syslog", false) + rels = appendLink(rels, "syslog", false, s.project) } if s.requiresUserDocker() { // Linking to cloud-init is a hack really. The problem is we need to link to something // that will trigger a reload - rels = appendLink(rels, "cloud-init", false) + rels = appendLink(rels, "cloud-init", false, s.project) } else if s.missingImage() { - rels = appendLink(rels, "network", false) + rels = appendLink(rels, "network", false, s.project) } return rels } @@ -62,7 +64,10 @@ func (s *Service) requiresUserDocker() bool { return s.Config().Labels.MapParts()[config.SCOPE] != config.SYSTEM } -func appendLink(deps []project.ServiceRelationship, name string, optional bool) []project.ServiceRelationship { +func appendLink(deps []project.ServiceRelationship, name string, optional bool, p *project.Project) []project.ServiceRelationship { + if _, ok := p.Configs[name]; !ok { + return deps + } rel := project.NewServiceRelationship(name, project.REL_TYPE_LINK) rel.Optional = optional return append(deps, rel) diff --git a/docker/service_factory.go b/docker/service_factory.go index cedcef0c..ff4b4a5d 100644 --- a/docker/service_factory.go +++ b/docker/service_factory.go @@ -23,5 +23,5 @@ func (s *ServiceFactory) Create(project *project.Project, name string, serviceCo } } - return NewService(s, name, serviceConfig, s.Context), nil + return NewService(s, name, serviceConfig, s.Context, project), nil }