github.com/david-imola/snapd@v0.0.0-20210611180407-2de8ddeece6d/overlord/snapstate/snapstate_config_defaults_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2016-2020 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 snapstate_test
    21  
    22  import (
    23  	. "gopkg.in/check.v1"
    24  
    25  	"github.com/snapcore/snapd/overlord/snapstate"
    26  	"github.com/snapcore/snapd/overlord/snapstate/snapstatetest"
    27  	"github.com/snapcore/snapd/overlord/state"
    28  	"github.com/snapcore/snapd/release"
    29  	"github.com/snapcore/snapd/snap"
    30  	"github.com/snapcore/snapd/snap/snaptest"
    31  )
    32  
    33  func (s *snapmgrTestSuite) TestConfigDefaults(c *C) {
    34  	r := release.MockOnClassic(false)
    35  	defer r()
    36  
    37  	// using MockSnap, we want to read the bits on disk
    38  	snapstate.MockSnapReadInfo(snap.ReadInfo)
    39  
    40  	s.state.Lock()
    41  	defer s.state.Unlock()
    42  
    43  	s.prepareGadget(c)
    44  
    45  	deviceCtx := deviceWithGadgetContext("the-gadget")
    46  
    47  	snapstate.Set(s.state, "some-snap", &snapstate.SnapState{
    48  		Active: true,
    49  		Sequence: []*snap.SideInfo{
    50  			{RealName: "some-snap", Revision: snap.R(11), SnapID: "somesnapidididididididididididid"},
    51  		},
    52  		Current:  snap.R(11),
    53  		SnapType: "app",
    54  	})
    55  	makeInstalledMockCoreSnap(c)
    56  
    57  	defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "some-snap")
    58  	c.Assert(err, IsNil)
    59  	c.Assert(defls, DeepEquals, map[string]interface{}{"key": "value"})
    60  
    61  	snapstate.Set(s.state, "local-snap", &snapstate.SnapState{
    62  		Active: true,
    63  		Sequence: []*snap.SideInfo{
    64  			{RealName: "local-snap", Revision: snap.R(5)},
    65  		},
    66  		Current:  snap.R(5),
    67  		SnapType: "app",
    68  	})
    69  	_, err = snapstate.ConfigDefaults(s.state, deviceCtx, "local-snap")
    70  	c.Assert(err, Equals, state.ErrNoState)
    71  }
    72  
    73  func (s *snapmgrTestSuite) TestConfigDefaultsSmokeUC20(c *C) {
    74  	r := release.MockOnClassic(false)
    75  	defer r()
    76  
    77  	// using MockSnap, we want to read the bits on disk
    78  	snapstate.MockSnapReadInfo(snap.ReadInfo)
    79  
    80  	s.state.Lock()
    81  	defer s.state.Unlock()
    82  
    83  	// provide a uc20 gadget structure
    84  	s.prepareGadget(c, `
    85          bootloader: grub
    86          structure:
    87          - name: ubuntu-seed
    88            role: system-seed
    89            filesystem: vfat
    90            type: EF,C12A7328-F81F-11D2-BA4B-00A0C93EC93B
    91            size: 1200M
    92          - name: ubuntu-boot
    93            role: system-boot
    94            filesystem: ext4
    95            type: 83,0FC63DAF-8483-4772-8E79-3D69D8477DE4
    96            # whats the appropriate size?
    97            size: 750M
    98          - name: ubuntu-data
    99            role: system-data
   100            filesystem: ext4
   101            type: 83,0FC63DAF-8483-4772-8E79-3D69D8477DE4
   102            size: 1G
   103  `)
   104  	// use a UC20 model context
   105  	deviceCtx := deviceWithGadgetContext20("the-gadget")
   106  
   107  	snapstate.Set(s.state, "some-snap", &snapstate.SnapState{
   108  		Active: true,
   109  		Sequence: []*snap.SideInfo{
   110  			{RealName: "some-snap", Revision: snap.R(11), SnapID: "somesnapidididididididididididid"},
   111  		},
   112  		Current:  snap.R(11),
   113  		SnapType: "app",
   114  	})
   115  	makeInstalledMockCoreSnap(c)
   116  
   117  	defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "some-snap")
   118  	c.Assert(err, IsNil)
   119  	c.Assert(defls, DeepEquals, map[string]interface{}{"key": "value"})
   120  }
   121  
   122  func (s *snapmgrTestSuite) TestConfigDefaultsNoGadget(c *C) {
   123  	r := release.MockOnClassic(false)
   124  	defer r()
   125  
   126  	// using MockSnap, we want to read the bits on disk
   127  	snapstate.MockSnapReadInfo(snap.ReadInfo)
   128  
   129  	s.state.Lock()
   130  	defer s.state.Unlock()
   131  
   132  	deviceCtxNoGadget := deviceWithoutGadgetContext()
   133  
   134  	snapstate.Set(s.state, "some-snap", &snapstate.SnapState{
   135  		Active: true,
   136  		Sequence: []*snap.SideInfo{
   137  			{RealName: "some-snap", Revision: snap.R(11), SnapID: "somesnapidididididididididididid"},
   138  		},
   139  		Current:  snap.R(11),
   140  		SnapType: "app",
   141  	})
   142  	makeInstalledMockCoreSnap(c)
   143  
   144  	_, err := snapstate.ConfigDefaults(s.state, deviceCtxNoGadget, "some-snap")
   145  	c.Assert(err, Equals, state.ErrNoState)
   146  }
   147  
   148  func (s *snapmgrTestSuite) TestConfigDefaultsSystemWithCore(c *C) {
   149  	r := release.MockOnClassic(false)
   150  	defer r()
   151  
   152  	// using MockSnapReadInfo, we want to read the bits on disk
   153  	snapstate.MockSnapReadInfo(snap.ReadInfo)
   154  
   155  	s.state.Lock()
   156  	defer s.state.Unlock()
   157  
   158  	s.prepareGadget(c, `
   159  defaults:
   160      system:
   161          foo: bar
   162  `)
   163  
   164  	deviceCtx := deviceWithGadgetContext("the-gadget")
   165  
   166  	snapstate.Set(s.state, "core", &snapstate.SnapState{
   167  		Active: true,
   168  		Sequence: []*snap.SideInfo{
   169  			{RealName: "some-snap", Revision: snap.R(11), SnapID: "the-core-ididididididididididid"},
   170  		},
   171  		Current:  snap.R(11),
   172  		SnapType: "os",
   173  	})
   174  
   175  	makeInstalledMockCoreSnap(c)
   176  
   177  	defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "core")
   178  	c.Assert(err, IsNil)
   179  	c.Assert(defls, DeepEquals, map[string]interface{}{"foo": "bar"})
   180  }
   181  
   182  var snapdSnapYaml = `name: snapd
   183  version: 1.0
   184  type: snapd
   185  `
   186  
   187  func (s *snapmgrTestSuite) TestConfigDefaultsSystemWithSnapdNoCore(c *C) {
   188  	r := release.MockOnClassic(false)
   189  	defer r()
   190  
   191  	// using MockSnapReadInfo, we want to read the bits on disk
   192  	snapstate.MockSnapReadInfo(snap.ReadInfo)
   193  
   194  	s.state.Lock()
   195  	defer s.state.Unlock()
   196  
   197  	s.prepareGadget(c, `
   198  defaults:
   199      system:
   200          foo: bar
   201  `)
   202  
   203  	deviceCtx := &snapstatetest.TrivialDeviceContext{
   204  		DeviceModel: MakeModel(map[string]interface{}{
   205  			"gadget": "the-gadget",
   206  			"base":   "the-base",
   207  		}),
   208  	}
   209  
   210  	snapstate.Set(s.state, "core", nil)
   211  	snapstate.Set(s.state, "snapd", &snapstate.SnapState{
   212  		Active: true,
   213  		Sequence: []*snap.SideInfo{
   214  			{RealName: "snapd", SnapID: "the-snapd-snapidididididididididi", Revision: snap.R(1)},
   215  		},
   216  		Current:  snap.R(1),
   217  		SnapType: "snapd",
   218  	})
   219  
   220  	snaptest.MockSnap(c, snapdSnapYaml, &snap.SideInfo{
   221  		RealName: "snapd",
   222  		Revision: snap.R(1),
   223  	})
   224  
   225  	defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "core")
   226  	c.Assert(err, IsNil)
   227  	c.Assert(defls, DeepEquals, map[string]interface{}{"foo": "bar"})
   228  }
   229  
   230  func (s *snapmgrTestSuite) TestConfigDefaultsSystemConflictsCoreSnapId(c *C) {
   231  	r := release.MockOnClassic(false)
   232  	defer r()
   233  
   234  	// using MockSnapReadInfo, we want to read the bits on disk
   235  	snapstate.MockSnapReadInfo(snap.ReadInfo)
   236  
   237  	s.state.Lock()
   238  	defer s.state.Unlock()
   239  
   240  	s.prepareGadget(c, `
   241  defaults:
   242      system:
   243          foo: bar
   244      thecoresnapididididididididididi:
   245          foo: other-bar
   246          other-key: other-key-default
   247  `)
   248  
   249  	deviceCtx := deviceWithGadgetContext("the-gadget")
   250  
   251  	snapstate.Set(s.state, "core", &snapstate.SnapState{
   252  		Active: true,
   253  		Sequence: []*snap.SideInfo{
   254  			{RealName: "core", SnapID: "thecoresnapididididididididididi", Revision: snap.R(1)},
   255  		},
   256  		Current:  snap.R(1),
   257  		SnapType: "os",
   258  	})
   259  
   260  	makeInstalledMockCoreSnap(c)
   261  
   262  	// 'system' key defaults take precedence over snap-id ones
   263  	defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "core")
   264  	c.Assert(err, IsNil)
   265  	c.Assert(defls, DeepEquals, map[string]interface{}{"foo": "bar"})
   266  }
   267  
   268  func (s *snapmgrTestSuite) TestTransitionCoreTasksNoUbuntuCore(c *C) {
   269  	s.state.Lock()
   270  	defer s.state.Unlock()
   271  
   272  	snapstate.Set(s.state, "core", &snapstate.SnapState{
   273  		Active:   true,
   274  		Sequence: []*snap.SideInfo{{RealName: "corecore", SnapID: "core-snap-id", Revision: snap.R(1)}},
   275  		Current:  snap.R(1),
   276  		SnapType: "os",
   277  	})
   278  
   279  	_, err := snapstate.TransitionCore(s.state, "ubuntu-core", "core")
   280  	c.Assert(err, ErrorMatches, `cannot transition snap "ubuntu-core": not installed`)
   281  }