Example #1
0
    def test_is_passthrough_enabled_hook(self):
        snap_dict = OrderedDict(
            {
                "name": "snap-test",
                "version": "test-version",
                "summary": "test-summary",
                "description": "test-description",
                "hooks": {"test-hook": {"passthrough": {"some-key": "some-value"}}},
            }
        )

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        self.assertEqual(True, snap.is_passthrough_enabled)
Example #2
0
    def test_simple(self):
        snap_dict = OrderedDict({
            "name": "snap-test",
            "version": "snap-version",
            "summary": "snap-summary",
            "description": "snap-description",
            "grade": "stable",
        })

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        self.assertEqual(snap_dict, snap.to_dict())
        self.assertEqual(False, snap.is_passthrough_enabled)
        self.assertEqual(snap_dict["name"], snap.name)
        self.assertEqual(snap_dict["version"], snap.version)
        self.assertEqual(snap_dict["summary"], snap.summary)
        self.assertEqual(snap_dict["description"], snap.description)
Example #3
0
    def test_grade_devel_statisfies_required_grade(self):
        self.fake_snapd.snaps_result = [{
            "name": "fake-base",
            "channel": "edge",
            "revision": "fake-revision"
        }]

        snap_dict = OrderedDict({
            "name": "snap-test",
            "base": "fake-base",
            "version": "snap-version",
            "summary": "snap-summary",
            "description": "snap-description",
            "grade": "devel",
        })

        snap = Snap.from_dict(snap_dict=snap_dict)

        snap.validate()
Example #4
0
    def test_ensure_command_chain_assumption(self):
        snap_dict = OrderedDict({
            "name": "snap-test",
            "version": "snap-version",
            "summary": "snap-summary",
            "description": "snap-description",
            "apps": {
                "test-app": {
                    "command": "test-app",
                    "command-chain": ["test-command-chain"],
                }
            },
        })

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap._ensure_command_chain_assumption()
        snap.validate()

        self.assertEqual({"command-chain"}, snap.assumes)
Example #5
0
    def test_write_snap_yaml_with_base_core18(self):
        snap_dict = OrderedDict({
            "name": "snap-test",
            "version": "snap-version",
            "summary": "snap-summary",
            "description": "snap-description",
            "base": "core18",
            "grade": "devel",
        })

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        # Write snap yaml.
        snap_yaml_path = os.path.join(self.path, "snap.yaml")
        snap.write_snap_yaml(path=snap_yaml_path)

        # Read snap yaml.
        written_snap_yaml = open(snap_yaml_path, "r").read()

        self.assertEqual(snap_dict, snap.to_dict())
        self.assertTrue("base" in written_snap_yaml)
Example #6
0
    def test_system_usernames_shortform_scope(self):
        snap_dict = OrderedDict({
            "name": "snap-test",
            "version": "test-version",
            "summary": "test-summary",
            "description": "test-description",
            "system-usernames": {
                "snap_daemon": "shared",
                "lxd": "shared"
            },
        })

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        self.assertThat(snap.system_usernames["snap_daemon"].name,
                        Equals("snap_daemon"))
        self.assertThat(snap.system_usernames["snap_daemon"].scope,
                        Equals(SystemUserScope.SHARED))
        self.assertThat(snap.system_usernames["lxd"].name, Equals("lxd"))
        self.assertThat(snap.system_usernames["lxd"].scope,
                        Equals(SystemUserScope.SHARED))
Example #7
0
    def test_all_keys(self):
        snap_dict = {
            "name": "snap-test",
            "version": "test-version",
            "summary": "test-summary",
            "description": "test-description",
            "adopt-info": "some-part",
            "apps": {"test-app": {"command": "test-app"}},
            "architectures": ["all"],
            "assumes": ["command-chain"],
            "base": "core18",
            "confinement": "strict",
            "compression": "lzo",
            "environment": {"TESTING": "1"},
            "epoch": 0,
            "grade": "devel",
            "hooks": {
                "test-hook": {
                    "command-chain": ["cmd1"],
                    "environment": {"FOO": "BAR"},
                    "plugs": ["network"],
                }
            },
            "layout": {"/target": {"bind": "$SNAP/foo"}},
            "license": "GPL",
            "passthrough": {"test": "value"},
            "plugs": {"test-plug": {"interface": "some-value"}},
            "slots": {"test-slot": {"interface": "some-value"}},
            "system-usernames": {"snap_daemon": {"scope": "shared"}},
            "title": "test-title",
            "type": "base",
        }

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        self.assertEqual(snap_dict, snap.to_dict())
        self.assertEqual(True, snap.is_passthrough_enabled)
Example #8
0
    def test_build_base_and_write_snap_yaml_type_base_with_build_base(self):
        snap_dict = OrderedDict({
            "name": "core20",
            "version": "snap-version",
            "summary": "snap-summary",
            "description": "snap-description",
            "grade": "devel",
            "build-base": "core18",
            "type": "base",
        })

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        # Write snap yaml.
        snap_yaml_path = os.path.join(self.path, "snap.yaml")
        snap.write_snap_yaml(path=snap_yaml_path)

        # Read snap yaml.
        written_snap_yaml = open(snap_yaml_path, "r").read()

        self.assertTrue("base" in written_snap_yaml)
        self.assertFalse("build-base" in written_snap_yaml)
        self.assertEqual(snap.get_build_base(), "core18")
Example #9
0
    def __init__(self, project: project.Project) -> None:
        self.build_snaps: Set[str] = set()
        self.project = project

        # raw_snapcraft_yaml is read only, create a new copy
        snapcraft_yaml = apply_extensions(project.info.get_raw_snapcraft())

        self.validator = Validator(snapcraft_yaml)
        self.validator.validate()

        snapcraft_yaml = self._expand_filesets(snapcraft_yaml)

        self.data = self._expand_env(snapcraft_yaml)

        self.data["architectures"] = _process_architectures(
            self.data.get("architectures"), project.deb_arch)

        self._ensure_no_duplicate_app_aliases()

        grammar_processor = grammar_processing.GlobalGrammarProcessor(
            properties=self.data, project=project)

        keys_path = project._get_keys_path()
        if any([
                package_repo.install(keys_path=keys_path)
                for package_repo in project._snap_meta.package_repositories
        ]):
            repo.Repo.refresh_build_packages()

        self.build_tools = grammar_processor.get_build_packages()
        self.build_tools |= set(project.additional_build_packages)

        # If version: git is used we want to add "git" to build-packages
        if self.data.get("version") == "git":
            self.build_tools.add("git")

        # XXX: Resetting snap_meta due to above mangling of data.
        # Convergence to operating on snap_meta will remove this requirement...
        project._snap_meta = Snap.from_dict(self.data)

        # Always add the base for building for non os and base snaps
        if project.info.base is None and project.info.type in ("app",
                                                               "gadget"):
            raise SnapcraftEnvironmentError(
                "A base is required for snaps of type {!r}.".format(
                    project.info.type))
        if project.info.base is not None:
            # If the base is already installed by other means, skip its installation.
            # But, we should always add it when in a docker environment so
            # the creator of said docker image is aware that it is required.
            if common.is_process_container(
            ) or not repo.snaps.SnapPackage.is_snap_installed(
                    project.info.base):
                self.build_snaps.add(project.info.base)

        self.parts = PartsConfig(
            parts=self.data,
            project=project,
            validator=self.validator,
            build_snaps=self.build_snaps,
            build_tools=self.build_tools,
        )
Example #10
0
    def test_empty_from_dict(self):
        snap_dict = OrderedDict({})

        snap = Snap.from_dict(snap_dict=snap_dict)

        self.assertEqual(snap_dict, snap.to_dict())
Example #11
0
    def test_all_keys(self):
        snap_dict = OrderedDict({
            "name":
            "snap-test",
            "version":
            "test-version",
            "summary":
            "test-summary",
            "description":
            "test-description",
            "apps": {
                "test-app": {
                    "command": "test-app"
                }
            },
            "architectures": ["all"],
            "assumes": ["command-chain"],
            "base":
            "core",
            "confinement":
            "strict",
            "environment": {
                "TESTING": "1"
            },
            "epoch":
            0,
            "grade":
            "devel",
            "hooks": {
                "test-hook": {
                    "command-chain": ["cmd1"],
                    "plugs": ["network"]
                }
            },
            "layout": {
                "/target": {
                    "bind": "$SNAP/foo"
                }
            },
            "license":
            "GPL",
            "plugs": {
                "test-plug": OrderedDict({"interface": "some-value"})
            },
            "slots": {
                "test-slot": OrderedDict({"interface": "some-value"})
            },
            "system-usernames":
            OrderedDict({"snap_daemon": OrderedDict({"scope": "shared"})}),
            "title":
            "test-title",
            "type":
            "base",
        })

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        self.assertEqual(snap_dict, snap.to_dict())
        self.assertEqual(False, snap.is_passthrough_enabled)
        self.assertEqual(snap_dict["name"], snap.name)
        self.assertEqual(snap_dict["version"], snap.version)
        self.assertEqual(snap_dict["summary"], snap.summary)
        self.assertEqual(snap_dict["description"], snap.description)
        self.assertEqual(snap_dict["apps"]["test-app"],
                         snap.apps["test-app"].to_dict())
        self.assertEqual(snap_dict["architectures"], snap.architectures)
        self.assertEqual(set(snap_dict["assumes"]), snap.assumes)
        self.assertEqual(snap_dict["base"], snap.base)
        self.assertEqual(snap_dict["environment"], snap.environment)
        self.assertEqual(snap_dict["hooks"]["test-hook"],
                         snap.hooks["test-hook"].to_dict())
        self.assertEqual(snap_dict["license"], snap.license)
        self.assertEqual(snap_dict["plugs"]["test-plug"],
                         snap.plugs["test-plug"].to_yaml_object())
        self.assertEqual(snap_dict["slots"]["test-slot"],
                         snap.slots["test-slot"].to_yaml_object())
        self.assertEqual(snap_dict["confinement"], snap.confinement)
        self.assertEqual(snap_dict["title"], snap.title)
        self.assertEqual(snap_dict["type"], snap.type)
Example #12
0
    def test_snap_yaml_all_keys(self):
        snap_dict = {
            "name": "snap-test",
            "version": "test-version",
            "summary": "test-summary",
            "description": "test-description",
            "adopt-info": "some-part",
            "apps": {"test-app": {"command": "test-app"}},
            "architectures": ["all"],
            "assumes": ["command-chain"],
            "base": "core18",
            "confinement": "strict",
            "compression": "xz",
            "environment": {"TESTING": "1"},
            "epoch": 0,
            "grade": "devel",
            "hooks": {
                "test-hook": {
                    "command-chain": ["cmd1"],
                    "environment": {"FOO": "BAR"},
                    "plugs": ["network"],
                }
            },
            "layout": {"/target": {"bind": "$SNAP/foo"}},
            "license": "GPL",
            "links": {
                "issues": ["https://bug_url.org"],
                "donation": [
                    "https://paypal.com",
                    "https://cafecito.app/",
                    "https://ko-fi.com/",
                ],
                "contact": ["mailto:[email protected]", "*****@*****.**"],
                "source-code": ["https://github.com/org/source"],
                "website": ["https://webfront.org"],
            },
            "package-repositories": [
                {"type": "apt", "ppa": "test/ppa"},
                {
                    "type": "apt",
                    "architectures": ["amd64", "i386"],
                    "components": ["main"],
                    "formats": ["deb"],
                    "key-id": "A" * 40,
                    "key-server": "test-key-server.com",
                    "suites": ["xenial"],
                    "url": "http://archive.ubuntu.com",
                },
            ],
            "passthrough": {"test": "value"},
            "plugs": {"test-plug": {"interface": "some-value"}},
            "slots": {"test-slot": {"interface": "some-value"}},
            "system-usernames": {"snap_daemon": {"scope": "shared"}},
            "title": "test-title",
            "type": "base",
        }

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        expected_dict = snap_dict.copy()
        expected_dict.pop("adopt-info")
        expected_dict.pop("compression")
        expected_dict.pop("package-repositories")
        expected_dict.update(expected_dict.pop("passthrough"))

        self.assertEqual(expected_dict, snap.to_snap_yaml_dict())
        self.assertEqual(True, snap.is_passthrough_enabled)
Example #13
0
    def test_snap_yaml_all_keys(self):
        snap_dict = {
            "name":
            "snap-test",
            "version":
            "test-version",
            "summary":
            "test-summary",
            "description":
            "test-description",
            "adopt-info":
            "some-part",
            "apps": {
                "test-app": {
                    "command": "test-app"
                }
            },
            "architectures": ["all"],
            "assumes": ["command-chain"],
            "base":
            "core",
            "confinement":
            "strict",
            "environment": {
                "TESTING": "1"
            },
            "epoch":
            0,
            "grade":
            "devel",
            "hooks": {
                "test-hook": {
                    "command-chain": ["cmd1"],
                    "plugs": ["network"]
                }
            },
            "layout": {
                "/target": {
                    "bind": "$SNAP/foo"
                }
            },
            "license":
            "GPL",
            "package-repositories": [
                {
                    "type": "apt",
                    "ppa": "test/ppa"
                },
                {
                    "type": "apt",
                    "architectures": ["amd64", "i386"],
                    "components": ["main"],
                    "deb-types": ["deb"],
                    "key-id": "test-key-id",
                    "key-server": "test-key-server.com",
                    "name": "test-name",
                    "suites": ["xenial"],
                    "url": "http://archive.ubuntu.com",
                },
            ],
            "passthrough": {
                "test": "value"
            },
            "plugs": {
                "test-plug": {
                    "interface": "some-value"
                }
            },
            "slots": {
                "test-slot": {
                    "interface": "some-value"
                }
            },
            "system-usernames": {
                "snap_daemon": {
                    "scope": "shared"
                }
            },
            "title":
            "test-title",
            "type":
            "base",
        }

        snap = Snap.from_dict(snap_dict=snap_dict)
        snap.validate()

        expected_dict = snap_dict.copy()
        expected_dict.pop("adopt-info")
        expected_dict.pop("base")
        expected_dict.pop("package-repositories")
        expected_dict.update(expected_dict.pop("passthrough"))

        self.assertEqual(expected_dict, snap.to_snap_yaml_dict())
        self.assertEqual(True, snap.is_passthrough_enabled)