コード例 #1
0
    def test_installed(self):
        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable/branch")
        snap_pkg.get_local_snap_info = lambda: {
            "channel": "strict/stable/branch"
        }

        self.assertTrue(snap_pkg.is_valid())
コード例 #2
0
    def test_install_non_classic(self):
        self.fake_snapd.find_result = [{
            "fake-snap": {
                "channels": {
                    "strict/stable": {
                        "confinement": "strict"
                    }
                }
            }
        }]

        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
        snap_pkg.install()
        self.assertThat(
            self.fake_snap_command.calls,
            Equals([
                ["snap", "whoami"],
                [
                    "sudo",
                    "snap",
                    "install",
                    "fake-snap",
                    "--channel",
                    "strict/stable",
                ],
            ]),
        )
コード例 #3
0
    def test_download_from_host(self):
        fake_get_assertion = fixtures.MockPatch(
            "snapcraft.internal.repo.snaps.get_assertion",
            return_value=b"foo-assert")
        self.useFixture(fake_get_assertion)

        self.fake_snapd.snaps_result = [{
            "id": "fake-snap-id",
            "name": "fake-snap",
            "channel": "stable",
            "revision": "10",
        }]

        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
        snap_pkg.local_download(snap_path="fake-snap.snap",
                                assertion_path="fake-snap.assert")

        self.assertThat("fake-snap.snap", FileExists())
        self.assertThat("fake-snap.assert",
                        FileContains("foo-assert\nfoo-assert\nfoo-assert\n"))
        fake_get_assertion.mock.assert_has_calls([
            mock.call([
                "account-key",
                "public-key-sha3-384=BWDEoaqyr25nF5SNCvEv2v7QnM9QsfCc0PBMYD_i2NGSQ32EF2d4D0hqUel3m8ul",
            ]),
            mock.call(["snap-declaration", "snap-name=fake-snap"]),
            mock.call(
                ["snap-revision", "snap-revision=10", "snap-id=fake-snap-id"]),
        ])
コード例 #4
0
    def test_refresh_to_classic(self):
        self.fake_snapd.find_result = [{
            "fake-snap": {
                "channels": {
                    "classic/stable": {
                        "confinement": "classic"
                    }
                }
            }
        }]

        snap_pkg = snaps.SnapPackage("fake-snap/classic/stable")
        snap_pkg.refresh()
        self.assertThat(
            self.fake_snap_command.calls,
            Equals([
                ["snap", "whoami"],
                [
                    "sudo",
                    "snap",
                    "refresh",
                    "fake-snap",
                    "--channel",
                    "classic/stable",
                    "--classic",
                ],
            ]),
        )
コード例 #5
0
    def test_refresh_fails(self):
        self.fake_snapd.find_result = [
            {"fake-snap": {"channels": {"strict/stable": {"confinement": "strict"}}}}
        ]

        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
        self.fake_snap_command.refresh_success = False
        self.assertRaises(errors.SnapRefreshError, snap_pkg.refresh)
コード例 #6
0
ファイル: test_snaps.py プロジェクト: tismith/snapcraft
    def test_refresh_fails(self):
        self.fake_snapd.find_result = [{
            'fake-snap': {'channels': {
                'strict/stable': {'confinement': 'strict'}}}}]

        snap_pkg = snaps.SnapPackage('fake-snap/strict/stable')
        self.fake_snap_command.refresh_success = False
        self.assertRaises(errors.SnapRefreshError, snap_pkg.refresh)
コード例 #7
0
    def _inject_snap(self, name: str, tmp_dir: str):
        snap = snaps.SnapPackage(name)
        if not snap.installed:
            raise errors.ContainerSnapNotFoundError(name)
        snap_info = snap.get_local_snap_info()
        id = snap_info["id"]
        # Lookup confinement to know if we need to --classic when installing
        is_classic = snap_info["confinement"] == "classic"

        # If the server has a different arch we can't inject local snaps
        target_arch = self._project_options.target_arch
        if target_arch and target_arch != self._get_container_arch():
            channel = snap_info["channel"]
            return self._install_snap(name, channel, is_classic=is_classic)

        # Revisions are unique, so we don't need to know the channel
        rev = snap_info["revision"]

        # https://github.com/snapcore/snapd/blob/master/snap/info.go
        # MountFile
        filename = "{}_{}.snap".format(name, rev)
        # https://github.com/snapcore/snapd/blob/master/dirs/dirs.go
        # CoreLibExecDir
        installed = os.path.join(os.path.sep, "var", "lib", "snapd", "snaps", filename)

        filepath = os.path.join(tmp_dir, filename)
        if rev.startswith("x"):
            logger.info("Making {} user-accessible".format(filename))
            subprocess.check_call(["sudo", "cp", installed, filepath])
            subprocess.check_call(["sudo", "chown", str(os.getuid()), filepath])
        else:
            shutil.copyfile(installed, filepath)

        if self._is_same_snap(filepath, name):
            logger.debug("Not re-injecting same version of {!r}".format(name))
            return

        if not rev.startswith("x"):
            self._inject_assertions(
                "{}_{}.assert".format(name, rev),
                [
                    ["account-key", "public-key-sha3-384={}".format(_STORE_KEY)],
                    ["snap-declaration", "snap-name={}".format(name)],
                    [
                        "snap-revision",
                        "snap-revision={}".format(rev),
                        "snap-id={}".format(id),
                    ],
                ],
                tmp_dir,
            )

        container_filename = os.path.join(os.sep, "run", filename)
        self._push_file(filepath, container_filename)
        self._install_snap(
            container_filename, is_dangerous=rev.startswith("x"), is_classic=is_classic
        )
コード例 #8
0
 def test_refresh_to_classic(self):
     snap_pkg = snaps.SnapPackage('fake-snap/classic/stable')
     snap_pkg.refresh()
     self.assertThat(
         self.fake_snap_command.calls,
         Equals([['snap', 'whoami'],
                 [
                     'sudo', 'snap', 'refresh', 'fake-snap', '--channel',
                     'classic/stable', '--classic'
                 ]]))
コード例 #9
0
 def test_install_non_classic(self):
     snap_pkg = snaps.SnapPackage('fake-snap/strict/stable')
     snap_pkg.install()
     self.assertThat(
         self.fake_snap_command.calls,
         Equals([['snap', 'whoami'],
                 [
                     'sudo', 'snap', 'install', 'fake-snap', '--channel',
                     'strict/stable'
                 ]]))
コード例 #10
0
    def test_download_classic(self):
        self.fake_snapd.find_result = [
            {"fake-snap": {"channels": {"classic/stable": {"confinement": "classic"}}}}
        ]

        snap_pkg = snaps.SnapPackage("fake-snap")
        snap_pkg.download()
        self.assertThat(
            self.fake_snap_command.calls, Equals([["snap", "download", "fake-snap"]])
        )
コード例 #11
0
    def test_download_channel(self):
        self.fake_snapd.find_result = [
            {"fake-snap": {"channels": {"strict/edge": {"confinement": "strict"}}}}
        ]

        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
        snap_pkg.download()
        self.assertThat(
            self.fake_snap_command.calls,
            Equals([["snap", "download", "fake-snap", "--channel", "strict/stable"]]),
        )
コード例 #12
0
    def _inject_snap(self, name: str, tmp_dir: str):
        snap = snaps.SnapPackage(name)
        if not snap.installed:
            raise errors.ContainerSnapNotFoundError(name)
        snap_info = snap.get_local_snap_info()
        id = snap_info['id']
        # Lookup confinement to know if we need to --classic when installing
        is_classic = snap_info['confinement'] == 'classic'

        # If the server has a different arch we can't inject local snaps
        target_arch = self._project_options.target_arch
        if (target_arch and target_arch != self._get_container_arch()):
            channel = snap_info['channel']
            return self._install_snap(name, channel, is_classic=is_classic)

        # Revisions are unique, so we don't need to know the channel
        rev = snap_info['revision']

        # https://github.com/snapcore/snapd/blob/master/snap/info.go
        # MountFile
        filename = '{}_{}.snap'.format(name, rev)
        # https://github.com/snapcore/snapd/blob/master/dirs/dirs.go
        # CoreLibExecDir
        installed = os.path.join(os.path.sep, 'var', 'lib', 'snapd', 'snaps',
                                 filename)

        filepath = os.path.join(tmp_dir, filename)
        if rev.startswith('x'):
            logger.info('Making {} user-accessible'.format(filename))
            subprocess.check_call(['sudo', 'cp', installed, filepath])
            subprocess.check_call(
                ['sudo', 'chown', str(os.getuid()), filepath])
        else:
            shutil.copyfile(installed, filepath)

        if self._is_same_snap(filepath, name):
            logger.debug('Not re-injecting same version of {!r}'.format(name))
            return

        if not rev.startswith('x'):
            self._inject_assertions('{}_{}.assert'.format(name, rev), [
                ['account-key', 'public-key-sha3-384={}'.format(_STORE_KEY)],
                ['snap-declaration', 'snap-name={}'.format(name)],
                [
                    'snap-revision', 'snap-revision={}'.format(rev),
                    'snap-id={}'.format(id)
                ],
            ], tmp_dir)

        container_filename = os.path.join(os.sep, 'run', filename)
        self._push_file(filepath, container_filename)
        self._install_snap(container_filename,
                           is_dangerous=rev.startswith('x'),
                           is_classic=is_classic)
コード例 #13
0
ファイル: test_snaps.py プロジェクト: tismith/snapcraft
    def test_install_non_classic(self):
        self.fake_snapd.find_result = [{
            'fake-snap': {'channels': {
                'strict/stable': {'confinement': 'strict'}}}}]

        snap_pkg = snaps.SnapPackage('fake-snap/strict/stable')
        snap_pkg.install()
        self.assertThat(self.fake_snap_command.calls, Equals([
            ['snap', 'whoami'],
            ['sudo', 'snap', 'install', 'fake-snap',
             '--channel', 'strict/stable']]))
コード例 #14
0
ファイル: test_snaps.py プロジェクト: tismith/snapcraft
    def test_refresh_to_classic(self):
        self.fake_snapd.find_result = [{
            'fake-snap': {'channels': {
                'classic/stable': {'confinement': 'classic'}}}}]

        snap_pkg = snaps.SnapPackage('fake-snap/classic/stable')
        snap_pkg.refresh()
        self.assertThat(self.fake_snap_command.calls, Equals([
            ['snap', 'whoami'],
            ['sudo', 'snap', 'refresh', 'fake-snap',
             '--channel', 'classic/stable', '--classic']]))
コード例 #15
0
 def test_refresh_logged_in(self):
     self.fake_snap_command.login('*****@*****.**')
     snap_pkg = snaps.SnapPackage('fake-snap/strict/stable')
     snap_pkg.refresh()
     self.assertThat(
         self.fake_snap_command.calls,
         Equals([['snap', 'whoami'],
                 [
                     'snap', 'refresh', 'fake-snap', '--channel',
                     'strict/stable'
                 ]]))
コード例 #16
0
    def test_prime_records_installed_snaps(self):
        self.run_snapcraft('prime', project_dir='basic')

        recorded_yaml_path = os.path.join(self.prime_dir, 'snap',
                                          'manifest.yaml')
        with open(recorded_yaml_path) as recorded_yaml_file:
            recorded_yaml = yaml.load(recorded_yaml_file)

        expected_package = 'core={}'.format(
            snaps.SnapPackage('core').get_local_snap_info()['revision'])
        self.assertThat(
            recorded_yaml['parts']['dummy-part']['installed-snaps'],
            Contains(expected_package))
コード例 #17
0
 def test_refresh_branch(self):
     snap_pkg = snaps.SnapPackage("fake-snap/strict/stable/branch")
     snap_pkg.refresh()
     self.assertThat(
         self.fake_snap_command.calls,
         Equals([
             ["snap", "whoami"],
             [
                 "sudo",
                 "snap",
                 "refresh",
                 "fake-snap",
                 "--channel",
                 "strict/stable/branch",
             ],
         ]),
     )
コード例 #18
0
    def test_prime_records_installed_snaps(self):
        if os.environ.get('ADT_TEST') and self.deb_arch == 'armhf':
            self.skipTest("The autopkgtest armhf runners can't install snaps")

        subprocess.check_call(['sudo', 'snap', 'install', 'core'])
        self.run_snapcraft('prime', project_dir='basic')

        recorded_yaml_path = os.path.join(self.prime_dir, 'snap',
                                          'manifest.yaml')
        with open(recorded_yaml_path) as recorded_yaml_file:
            recorded_yaml = yaml.load(recorded_yaml_file)

        expected_package = 'core={}'.format(
            snaps.SnapPackage('core').get_local_snap_info()['revision'])
        self.assertThat(
            recorded_yaml['parts']['dummy-part']['installed-snaps'],
            Contains(expected_package))
コード例 #19
0
    def test_refresh_logged_in(self):
        self.fake_snapd.find_result = [
            {"fake-snap": {"channels": {"strict/stable": {"confinement": "strict"}}}}
        ]

        self.fake_snap_command.login("*****@*****.**")
        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
        snap_pkg.refresh()
        self.assertThat(
            self.fake_snap_command.calls,
            Equals(
                [
                    ["snap", "whoami"],
                    ["snap", "refresh", "fake-snap", "--channel", "strict/stable"],
                ]
            ),
        )
コード例 #20
0
    def test_download_from_host_dangerous(self):
        fake_get_assertion = fixtures.MockPatch(
            "snapcraft.internal.repo.snaps.get_assertion",
            return_value=b"foo-assert")
        self.useFixture(fake_get_assertion)
        self.fake_snapd.snaps_result = [{
            "id": "fake-snap-id",
            "name": "fake-snap",
            "channel": "stable",
            "revision": "x1",
        }]

        snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
        snap_pkg.local_download(snap_path="fake-snap.snap",
                                assertion_path="fake-snap.assert")

        self.assertThat("fake-snap.snap", FileExists())
        self.assertThat("fake-snap.assert", FileContains(""))
        fake_get_assertion.mock.assert_not_called()
コード例 #21
0
    def test_install_classic_not_on_channel(self):
        self.fake_snapd.find_result = [{"fake-snap": {"channels": {}}}]

        snap_pkg = snaps.SnapPackage("fake-snap/classic/stable")
        snap_pkg.install()
        self.assertThat(
            self.fake_snap_command.calls,
            Equals([
                ["snap", "whoami"],
                [
                    "sudo",
                    "snap",
                    "install",
                    "fake-snap",
                    "--channel",
                    "classic/stable",
                ],
            ]),
        )
コード例 #22
0
    def test_prime_records_build_snaps(self):
        self.useFixture(fixture_setup.WithoutSnapInstalled('hello'))
        snapcraft_yaml = fixture_setup.SnapcraftYaml(self.path)
        snapcraft_yaml.update_part('test-part', {
            'plugin': 'nil',
            'build-snaps': ['hello']
        })
        self.useFixture(snapcraft_yaml)

        self.run_snapcraft('prime')

        expected_revision = snaps.SnapPackage(
            'hello').get_local_snap_info()['revision']
        recorded_yaml_path = os.path.join(self.prime_dir, 'snap',
                                          'manifest.yaml')
        with open(recorded_yaml_path) as recorded_yaml_file:
            recorded_yaml = yaml.load(recorded_yaml_file)

        self.assertThat(recorded_yaml['build-snaps'],
                        Equals(['hello={}'.format(expected_revision)]))
コード例 #23
0
    def test_prime_records_build_snaps(self):
        if os.environ.get('ADT_TEST') and self.deb_arch == 'armhf':
            self.skipTest("The autopkgtest armhf runners can't install snaps")

        self.useFixture(fixture_setup.WithoutSnapInstalled('hello'))
        snapcraft_yaml = fixture_setup.SnapcraftYaml(self.path)
        snapcraft_yaml.update_part('test-part', {
            'plugin': 'nil',
            'build-snaps': ['hello']
        })
        self.useFixture(snapcraft_yaml)

        self.run_snapcraft('prime')

        expected_revision = snaps.SnapPackage(
            'hello').get_local_snap_info()['revision']
        recorded_yaml_path = os.path.join(self.prime_dir, 'snap',
                                          'manifest.yaml')
        with open(recorded_yaml_path) as recorded_yaml_file:
            recorded_yaml = yaml.load(recorded_yaml_file)

        self.assertThat(recorded_yaml['build-snaps'],
                        Equals(['hello={}'.format(expected_revision)]))
コード例 #24
0
 def test_get_current_channel(self):
     self.fake_snapd.snaps_result = self.installed_snaps
     snap_pkg = snaps.SnapPackage(self.snap)
     self.assertThat(snap_pkg.get_current_channel(), Equals(self.expected))
コード例 #25
0
 def assert_channels(self, snap, installed_snaps, expected):
     self.fake_snapd.snaps_result = installed_snaps
     snap_pkg = snaps.SnapPackage(snap)
     self.assertThat(snap_pkg.get_current_channel(), Equals(expected))
コード例 #26
0
 def test_is_valid(self):
     self.fake_snapd.find_result = self.find_result
     snap_pkg = snaps.SnapPackage(self.snap)
     self.assertThat(snap_pkg.is_valid(), Is(self.expected))
コード例 #27
0
 def test_is_installed(self):
     self.fake_snapd.snaps_result = self.installed_snaps
     snap_pkg = snaps.SnapPackage(self.snap)
     self.assertThat(snap_pkg.installed, Is(self.expected))
コード例 #28
0
 def test_install_fails(self):
     self.fake_snap_command.install_success = False
     snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
     self.assertRaises(errors.SnapInstallError, snap_pkg.install)
コード例 #29
0
 def assert_installed(self, snap, installed_snaps, expected):
     self.fake_snapd.snaps_result = installed_snaps
     snap_pkg = snaps.SnapPackage(snap)
     self.expectThat(snap_pkg.installed, Is(expected))
     self.expectThat(snaps.SnapPackage.is_snap_installed(snap),
                     Is(expected))
コード例 #30
0
 def test_refresh_fails(self):
     snap_pkg = snaps.SnapPackage("fake-snap/strict/stable")
     self.fake_snap_command.refresh_success = False
     self.assertRaises(errors.SnapRefreshError, snap_pkg.refresh)