diff --git a/compose/project.go b/compose/project.go index fd1c8859..946af2bc 100644 --- a/compose/project.go +++ b/compose/project.go @@ -6,10 +6,12 @@ import ( "golang.org/x/net/context" yaml "github.com/cloudfoundry-incubator/candiedyaml" + dockerClient "github.com/docker/engine-api/client" "github.com/docker/libcompose/cli/logger" composeConfig "github.com/docker/libcompose/config" "github.com/docker/libcompose/docker" composeClient "github.com/docker/libcompose/docker/client" + "github.com/docker/libcompose/project" "github.com/docker/libcompose/project/events" "github.com/docker/libcompose/project/options" @@ -245,13 +247,40 @@ func StageServices(cfg *config.CloudConfig, services ...string) error { } // Reduce service configurations to just image and labels + needToPull := false for _, serviceName := range p.ServiceConfigs.Keys() { serviceConfig, _ := p.ServiceConfigs.Get(serviceName) + + // test to see if we need to Pull + var client dockerClient.APIClient + if serviceConfig.Labels[config.ScopeLabel] != config.System { + client, err = rosDocker.NewDefaultClient() + if err != nil { + log.Error(err) + } + } else { + client, err = rosDocker.NewSystemClient() + if err != nil { + log.Error(err) + } + } + if client != nil { + _, _, err := client.ImageInspectWithRaw(context.Background(), serviceConfig.Image, false) + if err == nil { + log.Infof("Service %s using local image %s", serviceName, serviceConfig.Image) + continue + } + } + needToPull = true + p.ServiceConfigs.Add(serviceName, &composeConfig.ServiceConfig{ Image: serviceConfig.Image, Labels: serviceConfig.Labels, }) } - return p.Pull(context.Background()) + if needToPull { + return p.Pull(context.Background()) + } + return nil } diff --git a/docker/service.go b/docker/service.go index adb4ee30..3f1e95d9 100644 --- a/docker/service.go +++ b/docker/service.go @@ -54,7 +54,7 @@ func (s *Service) missingImage() bool { return false } client := s.context.ClientFactory.Create(s) - _, _, err := client.ImageInspectWithRaw(context.Background(), s.Config().Image, false) + _, _, err := client.ImageInspectWithRaw(context.Background(), image, false) return err != nil } diff --git a/tests/ros_services.go b/tests/ros_services.go index 747534e0..fedd48a5 100644 --- a/tests/ros_services.go +++ b/tests/ros_services.go @@ -5,10 +5,11 @@ import . "gopkg.in/check.v1" func (s *QemuSuite) TestRosLocalService(c *C) { s.RunQemu(c) + // System-docker s.CheckCall(c, `echo "FROM $(sudo system-docker images --format '{{.Repository}}:{{.Tag}}' | grep os-base)" > Dockerfile -sudo system-docker build -t testimage . +sudo system-docker build -t testimage .`) -echo "test:" > test.yml + s.CheckCall(c, `echo "test:" > test.yml echo " image: testimage" >> test.yml echo " entrypoint: ls" >> test.yml echo " labels:" >> test.yml @@ -18,7 +19,29 @@ echo " io.rancher.os.after: console" >> test.yml s.CheckCall(c, `sudo cp test.yml /var/lib/rancher/conf/test.yml`) s.CheckCall(c, `sudo ros service enable /var/lib/rancher/conf/test.yml`) - s.CheckCall(c, `sudo ros service up /var/lib/rancher/conf/test.yml`) + s.CheckCall(c, `sudo ros service up test`) + + s.CheckCall(c, `sudo ros service logs test | grep bin`) +} + +func (s *QemuSuite) TestRosLocalServiceUser(c *C) { + s.RunQemu(c) + + // User-docker + s.CheckCall(c, `echo "FROM alpine" > Dockerfile +sudo docker build -t testimage .`) + + s.CheckCall(c, `echo "test:" > test.yml +echo " image: testimage" >> test.yml +echo " entrypoint: ls" >> test.yml +echo " labels:" >> test.yml +echo " io.rancher.os.scope: user" >> test.yml +echo " io.rancher.os.after: console" >> test.yml +`) + + s.CheckCall(c, `sudo cp test.yml /var/lib/rancher/conf/test.yml`) + s.CheckCall(c, `sudo ros service enable /var/lib/rancher/conf/test.yml`) + s.CheckCall(c, `sudo ros service up test`) s.CheckCall(c, `sudo ros service logs test | grep bin`) }