diff --git a/glide.lock b/glide.lock index 6d63edc96..93f62b790 100644 --- a/glide.lock +++ b/glide.lock @@ -1,4 +1,4 @@ -hash: 5e9aeda91bffc11f916ff6c324b26a02a279ed1d691e7a783ca03dfab584083c +hash: 68fad31b1980075ca1e93f3883e1bbeb95022824c63defbecb4eafb240fded39 updated: 2017-08-25T11:52:16.848940186+02:00 imports: - name: cloud.google.com/go @@ -783,7 +783,7 @@ testImports: - name: github.com/gorilla/mux version: e444e69cbd2e2e3e0749a2f3c717cec491552bbf - name: github.com/libkermit/compose - version: 6167fd37267d2dfbcbcbee0a321adaa9531f4062 + version: 4a33a16f1446ba205c4da7b09105d5bdc293b432 subpackages: - check - name: github.com/libkermit/docker diff --git a/glide.yaml b/glide.yaml index fd204b587..c286e58ec 100644 --- a/glide.yaml +++ b/glide.yaml @@ -210,7 +210,7 @@ testImport: - package: github.com/go-check/check version: 11d3bc7aa68e238947792f30573146a3231fc0f1 - package: github.com/libkermit/compose - version: 6167fd37267d2dfbcbcbee0a321adaa9531f4062 + version: 4a33a16f1446ba205c4da7b09105d5bdc293b432 subpackages: - check - package: github.com/libkermit/docker diff --git a/vendor/github.com/libkermit/compose/check/compose.go b/vendor/github.com/libkermit/compose/check/compose.go index 1e4253b75..a94e1aaa7 100644 --- a/vendor/github.com/libkermit/compose/check/compose.go +++ b/vendor/github.com/libkermit/compose/check/compose.go @@ -5,8 +5,10 @@ package check import ( "github.com/go-check/check" + "fmt" "github.com/docker/docker/api/types" "github.com/libkermit/compose" + "strings" ) // Project holds compose related project attributes @@ -25,16 +27,44 @@ func CreateProject(c *check.C, name string, composeFiles ...string) *Project { } } -// Start creates and starts the compose project. -func (p *Project) Start(c *check.C) { - c.Assert(p.project.Start(), check.IsNil, - check.Commentf("error while starting compose project")) +// Start creates and starts services of the compose project,if no services are given, all the services are created/started. +func (p *Project) Start(c *check.C, services ...string) { + errString := "error while creating and starting compose project" + if services != nil && len(services) > 0 { + errString = fmt.Sprintf("error while creating and starting services %s compose project", strings.Join(services, ",")) + } + c.Assert(p.project.Start(services...), check.IsNil, + check.Commentf(errString)) } -// Stop shuts down and clean the project -func (p *Project) Stop(c *check.C) { - c.Assert(p.project.Stop(), check.IsNil, - check.Commentf("error while stopping compose project")) +// StartOnly starts services of the compose project,if no services are given, all the services are started. +func (p *Project) StartOnly(c *check.C, services ...string) { + errString := "error while starting compose project" + if services != nil && len(services) > 0 { + errString = fmt.Sprintf("error while starting services %s compose project", strings.Join(services, ",")) + } + c.Assert(p.project.StartOnly(services...), check.IsNil, + check.Commentf(errString)) +} + +// StopOnly stops services of the compose project,if no services are given, all the services are stopped. +func (p *Project) StopOnly(c *check.C, services ...string) { + errString := "error while stopping deleting compose project" + if services != nil && len(services) > 0 { + errString = fmt.Sprintf("error while stopping deleting services %s compose project", strings.Join(services, ",")) + } + c.Assert(p.project.StopOnly(services...), check.IsNil, + check.Commentf(errString)) +} + +// Stop shuts down and clean services of the compose project,if no services are given, all the services are stopped/deleted. +func (p *Project) Stop(c *check.C, services ...string) { + errString := "error while stopping and deleting compose project" + if services != nil && len(services) > 0 { + errString = fmt.Sprintf("error while stopping and deleting services %s compose project", strings.Join(services, ",")) + } + c.Assert(p.project.Stop(services...), check.IsNil, + check.Commentf(errString)) } // Scale scale a service up @@ -59,3 +89,15 @@ func (p *Project) Container(c *check.C, service string) types.ContainerJSON { check.Commentf("error while getting the container for service '%s'", service)) return container } + +// NoContainer check is there is no container for the service given +// It fails if there one or more containers or if the error returned +// does not indicate an empty container list +func (p *Project) NoContainer(c *check.C, service string) { + validErr := "No container found for '" + service + "' service" + _, err := p.project.Container(service) + c.Assert(err, check.NotNil, + check.Commentf("error while getting the container for service '%s'", service)) + c.Assert(err.Error(), check.Equals, validErr, + check.Commentf("error while getting the container for service '%s'", service)) +} diff --git a/vendor/github.com/libkermit/compose/compose.go b/vendor/github.com/libkermit/compose/compose.go index fb722f385..33f98e24a 100644 --- a/vendor/github.com/libkermit/compose/compose.go +++ b/vendor/github.com/libkermit/compose/compose.go @@ -23,6 +23,7 @@ import ( // Project holds compose related project attributes type Project struct { + composeFiles []string composeProject project.APIProject name string listenChan chan events.Event @@ -30,6 +31,7 @@ type Project struct { stopped chan struct{} deleted chan struct{} client client.APIClient + hasOpenedChan bool } // CreateProject creates a compose project with the given name based on the @@ -58,6 +60,7 @@ func CreateProject(name string, composeFiles ...string) (*Project, error) { return nil, err } p := &Project{ + composeFiles: composeFiles, composeProject: composeProject, name: name, listenChan: make(chan events.Event), @@ -65,6 +68,7 @@ func CreateProject(name string, composeFiles ...string) (*Project, error) { stopped: make(chan struct{}), deleted: make(chan struct{}), client: apiClient, + hasOpenedChan: true, } // Listen to compose events @@ -76,6 +80,11 @@ func CreateProject(name string, composeFiles ...string) (*Project, error) { // Start creates and starts the compose project. func (p *Project) Start(services ...string) error { + // If project chan are closed, recreate new compose project + if !p.hasOpenedChan { + newProject, _ := CreateProject(p.name, p.composeFiles...) + *p = *newProject + } ctx := context.Background() err := p.composeProject.Create(ctx, options.Create{}) if err != nil { @@ -94,7 +103,6 @@ func (p *Project) StartOnly(services ...string) error { } // Wait for compose to start <-p.started - close(p.started) return nil } @@ -106,7 +114,6 @@ func (p *Project) StopOnly(services ...string) error { return err } <-p.stopped - close(p.stopped) return nil } @@ -117,16 +124,39 @@ func (p *Project) Stop(services ...string) error { if err != nil { return err } - ctx := context.Background() - err = p.composeProject.Delete(ctx, options.Delete{}, services...) + + err = p.composeProject.Delete(context.Background(), options.Delete{}, services...) if err != nil { return err } <-p.deleted - close(p.deleted) + + existingContainers, err := p.existContainers(project.AnyState) + if err != nil { + return err + } + // Close channels only if there are no running services + if !existingContainers { + p.hasOpenedChan = false + close(p.started) + close(p.stopped) + close(p.deleted) + close(p.listenChan) + } return nil } +// Check if containers exist in the desirated state for the given services +func (p *Project) existContainers(stateFiltered project.State, services ...string) (bool, error) { + existingContainers := false + var err error + containersFound, err := p.composeProject.Containers(context.Background(), project.Filter{stateFiltered}) + if err == nil && containersFound != nil && len(containersFound) > 0 { + existingContainers = true + } + return existingContainers, err +} + // Scale scale a service up func (p *Project) Scale(service string, count int) error { return p.composeProject.Scale(context.Background(), 10, map[string]int{