github.com/rigado/snapd@v2.42.5-go-mod+incompatible/wrappers/core18_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2018 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package wrappers_test
    21  
    22  import (
    23  	"fmt"
    24  	"io/ioutil"
    25  	"os"
    26  	"path/filepath"
    27  
    28  	. "gopkg.in/check.v1"
    29  
    30  	"github.com/snapcore/snapd/dirs"
    31  	"github.com/snapcore/snapd/osutil"
    32  	"github.com/snapcore/snapd/release"
    33  	"github.com/snapcore/snapd/snap"
    34  	"github.com/snapcore/snapd/snap/snaptest"
    35  	"github.com/snapcore/snapd/systemd"
    36  	"github.com/snapcore/snapd/wrappers"
    37  )
    38  
    39  func makeMockSnapdSnap(c *C) *snap.Info {
    40  	err := os.MkdirAll(dirs.SnapServicesDir, 0755)
    41  	c.Assert(err, IsNil)
    42  	err = os.MkdirAll(dirs.SnapUserServicesDir, 0755)
    43  	c.Assert(err, IsNil)
    44  
    45  	info := snaptest.MockSnap(c, snapdYaml, &snap.SideInfo{Revision: snap.R(1)})
    46  	snapdDir := filepath.Join(info.MountDir(), "lib", "systemd", "system")
    47  	err = os.MkdirAll(snapdDir, 0755)
    48  	c.Assert(err, IsNil)
    49  	snapdSrv := filepath.Join(snapdDir, "snapd.service")
    50  	err = ioutil.WriteFile(snapdSrv, []byte("[Unit]\nExecStart=/usr/lib/snapd/snapd\n# X-Snapd-Snap: do-not-start"), 0644)
    51  	c.Assert(err, IsNil)
    52  	snapdShutdown := filepath.Join(snapdDir, "snapd.system-shutdown.service")
    53  	err = ioutil.WriteFile(snapdShutdown, []byte("[Unit]\nExecStart=/bin/umount --everything\n# X-Snapd-Snap: do-not-start"), 0644)
    54  	c.Assert(err, IsNil)
    55  	snapdAutoimport := filepath.Join(snapdDir, "snapd.autoimport.service")
    56  	err = ioutil.WriteFile(snapdAutoimport, []byte("[Unit]\nExecStart=/usr/bin/snap auto-import"), 0644)
    57  	c.Assert(err, IsNil)
    58  
    59  	userUnitDir := filepath.Join(info.MountDir(), "usr", "lib", "systemd", "user")
    60  	err = os.MkdirAll(userUnitDir, 0755)
    61  	c.Assert(err, IsNil)
    62  	agentSrv := filepath.Join(userUnitDir, "snapd.session-agent.service")
    63  	err = ioutil.WriteFile(agentSrv, []byte("[Unit]\nExecStart=/usr/bin/snap session-agent"), 0644)
    64  	c.Assert(err, IsNil)
    65  	agentSock := filepath.Join(userUnitDir, "snapd.session-agent.socket")
    66  	err = ioutil.WriteFile(agentSock, []byte("[Unit]\n[Socket]\nListenStream=%t/snap-session.socket"), 0644)
    67  	c.Assert(err, IsNil)
    68  
    69  	return info
    70  }
    71  
    72  func (s *servicesTestSuite) TestAddSnapServicesForSnapdOnCore(c *C) {
    73  	restore := release.MockOnClassic(false)
    74  	defer restore()
    75  
    76  	restore = release.MockReleaseInfo(&release.OS{ID: "ubuntu"})
    77  	defer restore()
    78  
    79  	// reset root dir
    80  	dirs.SetRootDir(s.tempdir)
    81  
    82  	systemctlRestorer := systemd.MockSystemctl(func(cmd ...string) ([]byte, error) {
    83  		s.sysdLog = append(s.sysdLog, cmd)
    84  		if cmd[0] == "show" && cmd[1] == "--property=Id,ActiveState,UnitFileState,Type" {
    85  			s := fmt.Sprintf("Type=oneshot\nId=%s\nActiveState=inactive\nUnitFileState=enabled\n", cmd[2])
    86  			return []byte(s), nil
    87  		}
    88  		return []byte("ActiveState=inactive\n"), nil
    89  	})
    90  	defer systemctlRestorer()
    91  
    92  	info := makeMockSnapdSnap(c)
    93  	// add the snapd service
    94  	err := wrappers.AddSnapServices(info, nil)
    95  	c.Assert(err, IsNil)
    96  
    97  	// check that snapd.service is created
    98  	content, err := ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "snapd.service"))
    99  	c.Assert(err, IsNil)
   100  	// and paths get re-written
   101  	c.Check(string(content), Equals, fmt.Sprintf("[Unit]\nExecStart=%s/snapd/1/usr/lib/snapd/snapd\n# X-Snapd-Snap: do-not-start", dirs.SnapMountDir))
   102  
   103  	// check that snapd.autoimport.service is created
   104  	content, err = ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "snapd.autoimport.service"))
   105  	c.Assert(err, IsNil)
   106  	// and paths get re-written
   107  	c.Check(string(content), Equals, fmt.Sprintf("[Unit]\nExecStart=%s/snapd/1/usr/bin/snap auto-import", dirs.SnapMountDir))
   108  
   109  	// check that snapd.system-shutdown.service is created
   110  	content, err = ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "snapd.system-shutdown.service"))
   111  	c.Assert(err, IsNil)
   112  	// and paths *do not* get re-written
   113  	c.Check(string(content), Equals, "[Unit]\nExecStart=/bin/umount --everything\n# X-Snapd-Snap: do-not-start")
   114  
   115  	// check that usr-lib-snapd.mount is created
   116  	content, err = ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "usr-lib-snapd.mount"))
   117  	c.Assert(err, IsNil)
   118  	c.Check(string(content), Equals, fmt.Sprintf(`[Unit]
   119  Description=Make the snapd snap tooling available for the system
   120  Before=snapd.service
   121  
   122  [Mount]
   123  What=%s/snap/snapd/1/usr/lib/snapd
   124  Where=/usr/lib/snapd
   125  Type=none
   126  Options=bind
   127  
   128  [Install]
   129  WantedBy=snapd.service
   130  `, dirs.GlobalRootDir))
   131  
   132  	// check that snapd.session-agent.service is created
   133  	content, err = ioutil.ReadFile(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.service"))
   134  	c.Assert(err, IsNil)
   135  	// and paths get re-written
   136  	c.Check(string(content), Equals, fmt.Sprintf("[Unit]\nExecStart=%s/snapd/1/usr/bin/snap session-agent", dirs.SnapMountDir))
   137  
   138  	// check that snapd.session-agent.socket is created
   139  	content, err = ioutil.ReadFile(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.socket"))
   140  	c.Assert(err, IsNil)
   141  	// and paths get re-written
   142  	c.Check(string(content), Equals, "[Unit]\n[Socket]\nListenStream=%t/snap-session.socket")
   143  
   144  	// check the systemctl calls
   145  	c.Check(s.sysdLog, DeepEquals, [][]string{
   146  		{"daemon-reload"},
   147  		{"--root", dirs.GlobalRootDir, "enable", "usr-lib-snapd.mount"},
   148  		{"stop", "usr-lib-snapd.mount"},
   149  		{"show", "--property=ActiveState", "usr-lib-snapd.mount"},
   150  		{"start", "usr-lib-snapd.mount"},
   151  		{"daemon-reload"},
   152  		{"--root", dirs.GlobalRootDir, "enable", "snapd.autoimport.service"},
   153  		{"--root", dirs.GlobalRootDir, "enable", "snapd.service"},
   154  		{"--root", dirs.GlobalRootDir, "enable", "snapd.system-shutdown.service"},
   155  		{"--root", dirs.GlobalRootDir, "is-active", "snapd.autoimport.service"},
   156  		{"stop", "snapd.autoimport.service"},
   157  		{"show", "--property=ActiveState", "snapd.autoimport.service"},
   158  		{"start", "snapd.autoimport.service"},
   159  		{"start", "snapd.service"},
   160  		{"start", "--no-block", "snapd.seeded.service"},
   161  		{"start", "--no-block", "snapd.autoimport.service"},
   162  		{"--user", "--global", "--root", dirs.GlobalRootDir, "enable", "snapd.session-agent.service"},
   163  		{"--user", "--global", "--root", dirs.GlobalRootDir, "enable", "snapd.session-agent.socket"},
   164  	})
   165  }
   166  
   167  func (s *servicesTestSuite) TestAddSnapServicesForSnapdOnClassic(c *C) {
   168  	restore := release.MockOnClassic(true)
   169  	defer restore()
   170  
   171  	info := makeMockSnapdSnap(c)
   172  	// add the snapd service
   173  	err := wrappers.AddSnapServices(info, nil)
   174  	c.Assert(err, IsNil)
   175  
   176  	// check that snapd services were *not* created
   177  	c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "snapd.service")), Equals, false)
   178  	c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "snapd.autoimport.service")), Equals, false)
   179  	c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "snapd.system-shutdown.service")), Equals, false)
   180  	c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "usr-lib-snapd.mount")), Equals, false)
   181  	c.Check(osutil.FileExists(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.service")), Equals, false)
   182  	c.Check(osutil.FileExists(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.socket")), Equals, false)
   183  
   184  	// check that no systemctl calls happened
   185  	c.Check(s.sysdLog, IsNil)
   186  }