Stop only the service ran by it's up command

Signed-off-by: Ulysses Souza <ulyssessouza@gmail.com>
This commit is contained in:
Ulysses Souza 2021-09-20 12:31:41 +02:00
parent 480a255a0e
commit 2a1e989f3e
5 changed files with 24 additions and 6 deletions

View File

@ -175,6 +175,7 @@ func runUp(ctx context.Context, backend api.Service, createOptions createOptions
} }
create := api.CreateOptions{ create := api.CreateOptions{
Services: services,
RemoveOrphans: createOptions.removeOrphans, RemoveOrphans: createOptions.removeOrphans,
Recreate: createOptions.recreateStrategy(), Recreate: createOptions.recreateStrategy(),
RecreateDependencies: createOptions.dependenciesRecreateStrategy(), RecreateDependencies: createOptions.dependenciesRecreateStrategy(),

View File

@ -186,6 +186,8 @@ type ImagesOptions struct {
// KillOptions group options of the Kill API // KillOptions group options of the Kill API
type KillOptions struct { type KillOptions struct {
// Services passed in the command line to be killed
Services []string
// Signal to send to containers // Signal to send to containers
Signal string Signal string
} }

View File

@ -36,8 +36,13 @@ func (s *composeService) Kill(ctx context.Context, project *types.Project, optio
func (s *composeService) kill(ctx context.Context, project *types.Project, options api.KillOptions) error { func (s *composeService) kill(ctx context.Context, project *types.Project, options api.KillOptions) error {
w := progress.ContextWriter(ctx) w := progress.ContextWriter(ctx)
services := options.Services
if len(services) == 0 {
services = project.ServiceNames()
}
var containers Containers var containers Containers
containers, err := s.getContainers(ctx, project.Name, oneOffInclude, true) containers, err := s.getContainers(ctx, project.Name, oneOffInclude, true, services...)
if err != nil { if err != nil {
return err return err
} }

View File

@ -56,18 +56,24 @@ func TestKillAll(t *testing.T) {
} }
func TestKillSignal(t *testing.T) { func TestKillSignal(t *testing.T) {
const serviceName = "service1"
mockCtrl := gomock.NewController(t) mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish() defer mockCtrl.Finish()
api := mocks.NewMockAPIClient(mockCtrl) api := mocks.NewMockAPIClient(mockCtrl)
tested.apiClient = api tested.apiClient = api
project := types.Project{Name: strings.ToLower(testProject), Services: []types.ServiceConfig{testService("service1")}} project := types.Project{Name: strings.ToLower(testProject), Services: []types.ServiceConfig{testService(serviceName)}}
listOptions := moby.ContainerListOptions{
Filters: filters.NewArgs(projectFilter(strings.ToLower(testProject)),
serviceFilter(serviceName)),
All: true,
}
ctx := context.Background() ctx := context.Background()
api.EXPECT().ContainerList(ctx, projectFilterListOpt()).Return([]moby.Container{testContainer("service1", "123", false)}, nil) api.EXPECT().ContainerList(ctx, listOptions).Return([]moby.Container{testContainer(serviceName, "123", false)}, nil)
api.EXPECT().ContainerKill(anyCancellableContext(), "123", "SIGTERM").Return(nil) api.EXPECT().ContainerKill(anyCancellableContext(), "123", "SIGTERM").Return(nil)
err := tested.kill(ctx, &project, compose.KillOptions{Signal: "SIGTERM"}) err := tested.kill(ctx, &project, compose.KillOptions{Services: []string{serviceName}, Signal: "SIGTERM"})
assert.NilError(t, err) assert.NilError(t, err)
} }

View File

@ -60,10 +60,14 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options
return progress.Run(ctx, func(ctx context.Context) error { return progress.Run(ctx, func(ctx context.Context) error {
go func() { go func() {
<-signalChan <-signalChan
s.Kill(ctx, project, api.KillOptions{}) // nolint:errcheck s.Kill(ctx, project, api.KillOptions{ // nolint:errcheck
Services: options.Create.Services,
})
}() }()
return s.Stop(ctx, project, api.StopOptions{}) return s.Stop(ctx, project, api.StopOptions{
Services: options.Create.Services,
})
}) })
} }
go func() { go func() {