Skip to content

Commit

Permalink
Pass 'disable' flag to StopServices wrapper to optionally disable ser…
Browse files Browse the repository at this point in the history
…vices. This is not yet used for real but will be used by service-control task.
  • Loading branch information
stolowski committed May 11, 2020
1 parent b45f782 commit 9789860
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 19 deletions.
2 changes: 1 addition & 1 deletion overlord/patch/patch5.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func patch5(st *state.State) error {
continue
}

err = wrappers.StopServices(svcs, snap.StopReasonRefresh, log, tm)
err = wrappers.StopServices(svcs, false, snap.StopReasonRefresh, log, tm)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion overlord/snapstate/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ type managerBackend interface {
CopySnapData(newSnap, oldSnap *snap.Info, meter progress.Meter) error
LinkSnap(info *snap.Info, dev boot.Device, linkCtx backend.LinkContext, tm timings.Measurer) (rebootRequired bool, err error)
StartServices(svcs []*snap.AppInfo, meter progress.Meter, tm timings.Measurer) error
StopServices(svcs []*snap.AppInfo, reason snap.ServiceStopReason, meter progress.Meter, tm timings.Measurer) error
StopServices(svcs []*snap.AppInfo, alsoDisable bool, reason snap.ServiceStopReason, meter progress.Meter, tm timings.Measurer) error
ServicesEnableState(info *snap.Info, meter progress.Meter) (map[string]bool, error)

// the undoers for install
Expand Down
4 changes: 2 additions & 2 deletions overlord/snapstate/backend/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@ func (b Backend) StartServices(apps []*snap.AppInfo, meter progress.Meter, tm ti
return wrappers.StartServices(apps, meter, tm)
}

func (b Backend) StopServices(apps []*snap.AppInfo, reason snap.ServiceStopReason, meter progress.Meter, tm timings.Measurer) error {
return wrappers.StopServices(apps, reason, meter, tm)
func (b Backend) StopServices(apps []*snap.AppInfo, alsoDisable bool, reason snap.ServiceStopReason, meter progress.Meter, tm timings.Measurer) error {
return wrappers.StopServices(apps, alsoDisable, reason, meter, tm)
}

func (b Backend) generateWrappers(s *snap.Info, disabledSvcs []string) error {
Expand Down
2 changes: 1 addition & 1 deletion overlord/snapstate/backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,7 @@ func (f *fakeSnappyBackend) StartServices(svcs []*snap.AppInfo, meter progress.M
return nil
}

func (f *fakeSnappyBackend) StopServices(svcs []*snap.AppInfo, reason snap.ServiceStopReason, meter progress.Meter, tm timings.Measurer) error {
func (f *fakeSnappyBackend) StopServices(svcs []*snap.AppInfo, alsoDisable bool, reason snap.ServiceStopReason, meter progress.Meter, tm timings.Measurer) error {
f.appendOp(&fakeOp{
op: fmt.Sprintf("stop-snap-services:%s", reason),
path: svcSnapMountDir(svcs),
Expand Down
2 changes: 1 addition & 1 deletion overlord/snapstate/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -1784,7 +1784,7 @@ func (m *SnapManager) stopSnapServices(t *state.Task, _ *tomb.Tomb) error {
defer st.Lock()

// stop the services
err = m.backend.StopServices(svcs, stopReason, pb, perfTimings)
err = m.backend.StopServices(svcs, false, stopReason, pb, perfTimings)
if err != nil {
return err
}
Expand Down
8 changes: 6 additions & 2 deletions wrappers/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -453,8 +453,9 @@ func EnableSnapServices(s *snap.Info, inter interacter) (err error) {
return nil
}

// StopServices stops service units for the applications from the snap which are services.
func StopServices(apps []*snap.AppInfo, reason snap.ServiceStopReason, inter interacter, tm timings.Measurer) error {
// StopServices stops and optionally disables service units for the applications
// from the snap which are services.
func StopServices(apps []*snap.AppInfo, alsoDisable bool, reason snap.ServiceStopReason, inter interacter, tm timings.Measurer) error {
sysd := systemd.New(dirs.GlobalRootDir, systemd.SystemMode, inter)

logger.Debugf("StopServices called for %q, reason: %v", apps, reason)
Expand All @@ -478,6 +479,9 @@ func StopServices(apps []*snap.AppInfo, reason snap.ServiceStopReason, inter int
var err error
timings.Run(tm, "stop-service", fmt.Sprintf("stop service %q", app.ServiceName()), func(nested timings.Measurer) {
err = stopService(sysd, app, inter)
if err == nil && alsoDisable {
err = sysd.Disable(app.ServiceName())
}
})
if err != nil {
return err
Expand Down
43 changes: 32 additions & 11 deletions wrappers/services_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func (s *servicesTestSuite) TestAddSnapServicesAndRemove(c *C) {
}

s.sysdLog = nil
err = wrappers.StopServices(info.Services(), "", progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", progress.Null, s.perfTimings)
c.Assert(err, IsNil)
c.Assert(s.sysdLog, HasLen, 2)
c.Check(s.sysdLog, DeepEquals, [][]string{
Expand Down Expand Up @@ -150,7 +150,7 @@ func (s *servicesTestSuite) TestAddSnapServicesAndRemoveUserDaemons(c *C) {
c.Check(string(content), Matches, "(?ms).*^"+regexp.QuoteMeta(expected)) // check.v1 adds ^ and $ around the regexp provided

s.sysdLog = nil
err = wrappers.StopServices(info.Services(), "", progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", progress.Null, s.perfTimings)
c.Assert(err, IsNil)
c.Assert(s.sysdLog, HasLen, 2)
c.Check(s.sysdLog, DeepEquals, [][]string{
Expand Down Expand Up @@ -190,7 +190,7 @@ func (s *servicesTestSuite) TestRemoveSnapWithSocketsRemovesSocketsService(c *C)
err := wrappers.AddSnapServices(info, nil, nil, progress.Null)
c.Assert(err, IsNil)

err = wrappers.StopServices(info.Services(), "", &progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", &progress.Null, s.perfTimings)
c.Assert(err, IsNil)

err = wrappers.RemoveSnapServices(info, &progress.Null)
Expand Down Expand Up @@ -234,7 +234,7 @@ apps:

svcFName := "snap.wat.wat.service"

err = wrappers.StopServices(info.Services(), "", progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", progress.Null, s.perfTimings)
c.Assert(err, IsNil)

c.Check(sysdLog, DeepEquals, [][]string{
Expand Down Expand Up @@ -277,7 +277,7 @@ apps:

svcFName := "snap.wat.wat.service"

err = wrappers.StopServices(info.Services(), "", progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", progress.Null, s.perfTimings)
c.Check(err, ErrorMatches, "some user services failed to stop")
c.Check(sysdLog, DeepEquals, [][]string{
{"--user", "stop", svcFName},
Expand Down Expand Up @@ -614,7 +614,7 @@ func (s *servicesTestSuite) TestStopServicesWithSockets(c *C) {
sysServices = nil
userServices = nil

err = wrappers.StopServices(info.Services(), "", &progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", &progress.Null, s.perfTimings)
c.Assert(err, IsNil)

sort.Strings(sysServices)
Expand Down Expand Up @@ -1408,12 +1408,12 @@ apps:
})

s.sysdLog = nil
err = wrappers.StopServices(info.Services(), snap.StopReasonRefresh, progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, snap.StopReasonRefresh, progress.Null, s.perfTimings)
c.Assert(err, IsNil)
c.Assert(s.sysdLog, HasLen, 0)

s.sysdLog = nil
err = wrappers.StopServices(info.Services(), snap.StopReasonRemove, progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, snap.StopReasonRemove, progress.Null, s.perfTimings)
c.Assert(err, IsNil)
c.Check(s.sysdLog, DeepEquals, [][]string{
{"stop", filepath.Base(survivorFile)},
Expand Down Expand Up @@ -1460,15 +1460,15 @@ apps:
})

s.sysdLog = nil
err = wrappers.StopServices(info.Services(), snap.StopReasonRefresh, progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, snap.StopReasonRefresh, progress.Null, s.perfTimings)
c.Assert(err, IsNil)
c.Check(s.sysdLog, DeepEquals, [][]string{
{"stop", filepath.Base(survivorFile)},
{"show", "--property=ActiveState", "snap.survive-snap.srv.service"},
}, Commentf("failure in %s", t.mode))

s.sysdLog = nil
err = wrappers.StopServices(info.Services(), snap.StopReasonRemove, progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, snap.StopReasonRemove, progress.Null, s.perfTimings)
c.Assert(err, IsNil)
switch t.expectedWho {
case "all":
Expand Down Expand Up @@ -1618,7 +1618,7 @@ func (s *servicesTestSuite) TestAddRemoveSnapWithTimersAddsRemovesTimerFiles(c *
c.Check(osutil.FileExists(app.Timer.File()), Equals, true)
c.Check(osutil.FileExists(app.ServiceFile()), Equals, true)

err = wrappers.StopServices(info.Services(), "", &progress.Null, s.perfTimings)
err = wrappers.StopServices(info.Services(), false, "", &progress.Null, s.perfTimings)
c.Assert(err, IsNil)

err = wrappers.RemoveSnapServices(info, &progress.Null)
Expand Down Expand Up @@ -1780,3 +1780,24 @@ func (s *servicesTestSuite) TestAddRemoveSnapServiceWithSnapd(c *C) {
err = wrappers.RemoveSnapServices(info, progress.Null)
c.Check(err, ErrorMatches, "internal error: removing explicit services for snapd snap is unexpected")
}

func (s *servicesTestSuite) TestStopAndDisableServices(c *C) {
info := snaptest.MockSnap(c, packageHello+`
svc1:
daemon: simple
`, &snap.SideInfo{Revision: snap.R(12)})
svcFile := "snap.hello-snap.svc1.service"

err := wrappers.AddSnapServices(info, nil, nil, progress.Null)
c.Assert(err, IsNil)

s.sysdLog = nil
alsoDisable := true
err = wrappers.StopServices(info.Services(), alsoDisable, "", progress.Null, s.perfTimings)
c.Assert(err, IsNil)
c.Check(s.sysdLog, DeepEquals, [][]string{
{"stop", svcFile},
{"show", "--property=ActiveState", svcFile},
{"--root", s.tempdir, "disable", svcFile},
})
}

0 comments on commit 9789860

Please sign in to comment.