def execute(self, **kwargs):
     wm = WorkspaceManager(self.get_ws_folder(**kwargs))
     out = {}
     out["rootFolder"] = str(wm.ws_root_folder)
     if wm.is_initialized:
         out["initialized"] = True
         out["profiles"] = {}
         for pfname, pf in wm.list_profiles().items():
             out["profiles"][pfname] = pf.json
             out["profiles"][pfname]["current"] = pf.is_current
     else:
         out["initialized"] = False
     return out
Example #2
0
def complete_environment_variable(*args, **kwargs):
    if kwargs["parser"].prog == "leaf env user":
        return env_keys(ConfigurationManager().read_user_configuration().
                        build_environment())
    elif kwargs["parser"].prog == "leaf env workspace":
        wm = WorkspaceManager(WorkspaceManager.find_root())
        if wm.is_initialized:
            return env_keys(wm.read_ws_configuration().build_environment())
    elif kwargs["parser"].prog == "leaf env profile":
        wm = WorkspaceManager(WorkspaceManager.find_root())
        if wm.is_initialized:
            return env_keys(wm.get_current_profile().build_environment())
    def execute(self, **kwargs):
        wm = WorkspaceManager(self.get_ws_folder(**kwargs))
        if not wm.is_initialized:
            raise WorkspaceNotInitializedException()
        profile = wm.get_profile(kwargs["profile"] if "profile" in kwargs else wm.current_profile_name)
        wm.is_profile_sync(profile, raise_if_not_sync=True)
        pf_env = wm.build_full_environment(profile)

        env_before = self.lines_to_dict(subprocess.check_output(self.build_shell_command("env")).decode().splitlines())
        env_after = self.lines_to_dict(subprocess.check_output(self.build_shell_command("env", env=pf_env)).decode().splitlines())

        out = OrderedDict()
        keys = kwargs.get("keys")
        for k in sorted(env_after.keys()):
            if k not in env_before or env_after[k] != env_before[k]:
                if keys is None or k in keys:
                    out[k] = env_after[k]
        return out
Example #4
0
 def get_workspacemanager(self, check_parents=True, check_initialized=True):
     out = WorkspaceManager(
         WorkspaceManager.find_root(check_parents=check_parents))
     if check_initialized and not out.is_initialized:
         raise WorkspaceNotInitializedException()
     return out
Example #5
0
 def setUp(self):
     super().setUp()
     self.wm = WorkspaceManager(self.workspace_folder)
     self.wm.create_remote("default", self.remote_url1, insecure=True)
     self.wm.create_remote("other", self.remote_url2, insecure=True)
Example #6
0
class TestApiWorkspaceManager(LeafTestCaseWithRepo):
    def setUp(self):
        super().setUp()
        self.wm = WorkspaceManager(self.workspace_folder)
        self.wm.create_remote("default", self.remote_url1, insecure=True)
        self.wm.create_remote("other", self.remote_url2, insecure=True)

    def test_init(self):
        with self.assertRaises(Exception):
            self.wm.create_profile("foo")
        self.wm.init_ws()
        profile = self.wm.create_profile("foo")
        self.assertIsNotNone(profile)
        self.assertEqual("foo", profile.name)

    def test_add_delete_profile(self):
        self.wm.init_ws()
        self.wm.create_profile("foo")
        self.assertEqual(1, len(self.wm.list_profiles()))

        with self.assertRaises(Exception):
            self.wm.create_profile("foo")

        self.wm.create_profile("bar")
        self.assertEqual(2, len(self.wm.list_profiles()))

        with self.assertRaises(Exception):
            self.wm.create_profile("bar")

        self.wm.delete_profile("foo")
        self.assertEqual(1, len(self.wm.list_profiles()))

        with self.assertRaises(Exception):
            self.wm.delete_profile("foo")
        self.assertEqual(1, len(self.wm.list_profiles()))

    def test_updatet_profile(self):
        self.wm.init_ws()
        profile = self.wm.create_profile("foo")
        self.assertEqual([], profile.packages)
        self.assertEqual(OrderedDict(), profile._getenvmap())

        profile.add_packages(PackageIdentifier.parse_list(["container-A_1.0"]))
        profile.update_environment(OrderedDict([("FOO", "BAR"), ("FOO2", "BAR2")]))
        self.wm.update_profile(profile)

        self.assertEqual(PackageIdentifier.parse_list(["container-A_1.0"]), profile.packages)
        self.assertEqual(OrderedDict([("FOO", "BAR"), ("FOO2", "BAR2")]), profile._getenvmap())

        profile.add_packages(PackageIdentifier.parse_list(["container-A_2.1"]))
        self.wm.update_profile(profile)
        self.assertEqual(PackageIdentifier.parse_list(["container-A_2.1"]), profile.packages)

        profile.add_packages(PackageIdentifier.parse_list(["env-A_1.0"]))
        self.wm.update_profile(profile)
        self.assertEqual(PackageIdentifier.parse_list(["container-A_2.1", "env-A_1.0"]), profile.packages)

        profile.remove_packages(PackageIdentifier.parse_list(["container-A_2.1"]))
        self.wm.update_profile(profile)
        self.assertEqual(PackageIdentifier.parse_list(["env-A_1.0"]), profile.packages)

        with self.assertRaises(Exception):
            profile.name = "fooooooo"
            self.wm.update_profile(profile)

    def test_rename_profile(self):
        self.wm.init_ws()
        self.wm.create_profile("foo")

        with self.assertRaises(NoProfileSelected):
            self.wm.current_profile_name
        profile = self.wm.get_profile("foo")
        self.wm.switch_profile(profile)
        self.assertEqual("foo", self.wm.current_profile_name)

        profile.add_packages(PackageIdentifier.parse_list(["container-A_2.1"]))
        profile.update_environment({"FOO": "BAR"})
        self.wm.update_profile(profile)

        self.wm.provision_profile(profile)
        self.assertEqual("foo", self.wm.current_profile_name)

        self.check_profile_content("foo", ["container-A", "container-C", "container-D"])

        profile = self.wm.rename_profile("foo", "bar")
        self.assertEqual(1, len(self.wm.list_profiles()))
        self.assertEqual("bar", profile.name)
        self.assertEqual("bar", self.wm.get_profile("bar").name)
        self.assertEqual("bar", self.wm.current_profile_name)
        self.check_profile_content("bar", ["container-A", "container-C", "container-D"])
        self.wm.build_full_environment(profile)
        with self.assertRaises(ProfileNameAlreadyExistException):
            self.wm.rename_profile("bar", "bar")
        with self.assertRaises(InvalidProfileNameException):
            self.wm.rename_profile("foo", "bar")

    def test_switch_profile(self):
        self.wm.init_ws()
        profile = self.wm.create_profile("foo")
        self.wm.switch_profile(profile)
        self.assertEqual("foo", self.wm.current_profile_name)

        profile2 = self.wm.create_profile("bar")
        self.wm.switch_profile(profile2)
        self.assertEqual("bar", self.wm.current_profile_name)

    def test_env(self):
        try:
            LeafSettings.PROFILE_NORELATIVE.value = 1

            self.wm.init_ws()
            profile = self.wm.create_profile("myenv")
            profile.add_packages([PackageIdentifier.parse(pis) for pis in ["env-A_1.0", "env-A_1.0"]])
            self.wm.update_profile(profile)

            self.wm.switch_profile(profile)
            self.wm.provision_profile(profile)

            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("LEAF_PROFILE", "myenv"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )

            self.wm.update_user_environment(set_map=OrderedDict((("scope", "user"), ("HELLO", "world"))))
            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("scope", "user"),
                    ("HELLO", "world"),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("LEAF_PROFILE", "myenv"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )

            self.wm.update_user_environment(unset_list=["HELLO"])
            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("scope", "user"),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("LEAF_PROFILE", "myenv"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )

            self.wm.update_ws_environment(set_map=OrderedDict((("scope", "workspace"), ("HELLO", "world"))))
            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("scope", "user"),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("scope", "workspace"),
                    ("HELLO", "world"),
                    ("LEAF_PROFILE", "myenv"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )

            self.wm.update_ws_environment(unset_list=["HELLO"])
            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("scope", "user"),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("scope", "workspace"),
                    ("LEAF_PROFILE", "myenv"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )

            profile.update_environment(set_map=OrderedDict((("scope", "profile"), ("HELLO", "world"))))
            self.wm.update_profile(profile)
            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("scope", "user"),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("scope", "workspace"),
                    ("LEAF_PROFILE", "myenv"),
                    ("scope", "profile"),
                    ("HELLO", "world"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )

            profile.update_environment(unset_list=["HELLO"])
            self.wm.update_profile(profile)
            self.assertEqual(
                [
                    ("LEAF_VERSION", leaf.__version__),
                    ("LEAF_PLATFORM_SYSTEM", platform.system()),
                    ("LEAF_PLATFORM_MACHINE", platform.machine()),
                    ("LEAF_PLATFORM_RELEASE", platform.release()),
                    ("scope", "user"),
                    ("LEAF_WORKSPACE", str(self.workspace_folder)),
                    ("scope", "workspace"),
                    ("LEAF_PROFILE", "myenv"),
                    ("scope", "profile"),
                    ("LEAF_ENV_B", "BAR"),
                    ("LEAF_PATH_B", "$PATH:{folder}/env-B_1.0".format(folder=self.install_folder)),
                    ("LEAF_ENV_A", "FOO"),
                    ("LEAF_ENV_A2", "Hello"),
                    ("LEAF_PATH_A", "$PATH:{folder}/env-A_1.0:{folder}/env-B_1.0".format(folder=self.install_folder)),
                ],
                env_tolist(self.wm.build_full_environment(profile)),
            )
        finally:
            LeafSettings.PROFILE_NORELATIVE.value = None

    def test_package_override(self):
        self.wm.init_ws()
        profile = self.wm.create_profile("myprofile")
        profile.add_packages(PackageIdentifier.parse_list(["container-A_1.0"]))
        self.wm.update_profile(profile)
        self.wm.provision_profile(profile)

        self.check_installed_packages(["container-A_1.0", "container-B_1.0", "container-C_1.0", "container-E_1.0"])
        self.check_profile_content("myprofile", ["container-A", "container-B", "container-C", "container-E"])

        profile.add_packages(PackageIdentifier.parse_list(["container-E_1.1"]))
        self.wm.update_profile(profile)
        self.wm.provision_profile(profile)

        self.check_installed_packages(["container-A_1.0", "container-B_1.0", "container-C_1.0", "container-E_1.0", "container-E_1.1"])
        self.check_profile_content("myprofile", ["container-A", "container-B", "container-C", "container-E"])
        self.assertEqual(
            PackageIdentifier.parse_list(["container-E_1.1", "container-B_1.0", "container-C_1.0", "container-A_1.0"]),
            list(map(IDENTIFIER_GETTER, self.wm.get_profile_dependencies(profile))),
        )

    def test_settings(self):
        self.wm.init_ws()
        profile = self.wm.create_profile("myprofile")
        self.wm.provision_profile(profile)
        self.wm.switch_profile(profile)

        self.wm.install_packages(PackageIdentifier.parse_list(["settings_1.0"]))

        setting = self.wm.get_setting("settings.lowercase")
        self.assertIsNotNone(setting)

        self.assertEqual(None, self.wm.get_setting_value("settings.lowercase"))
        with self.assertRaises(LeafException):
            self.wm.set_setting("settings.lowercase", "HELLO")
        with self.assertRaises(LeafException):
            self.wm.set_setting("settings.lowercase", "hello")
        self.wm.set_setting("settings.lowercase", "hello", Scope.USER)
        self.assertEqual("hello", self.wm.get_setting_value("settings.lowercase"))
        self.assertEqual("hello", self.wm.read_user_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))

        self.wm.set_setting("settings.lowercase", "helloo", Scope.WORKSPACE)
        self.assertEqual("helloo", self.wm.get_setting_value("settings.lowercase"))
        self.assertEqual("hello", self.wm.read_user_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))
        self.assertEqual("helloo", self.wm.read_ws_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))

        self.wm.set_setting("settings.lowercase", "hellooo", Scope.PROFILE)
        self.assertEqual("hellooo", self.wm.get_setting_value("settings.lowercase"))
        self.assertEqual("hello", self.wm.read_user_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))
        self.assertEqual("helloo", self.wm.read_ws_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))
        self.assertEqual("hellooo", self.wm.get_profile(self.wm.current_profile_name).build_environment().find_value("LEAF_SETTING_LOWERCASE"))

        self.wm.unset_setting("settings.lowercase")
        self.assertEqual(None, self.wm.get_setting_value("settings.lowercase"))
        self.assertEqual(None, self.wm.read_user_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))
        self.assertEqual(None, self.wm.read_ws_configuration().build_environment().find_value("LEAF_SETTING_LOWERCASE"))
        self.assertEqual(None, self.wm.get_profile(self.wm.current_profile_name).build_environment().find_value("LEAF_SETTING_LOWERCASE"))

        self.assertEqual(None, self.wm.get_setting_value("settings.user"))
        with self.assertRaises(LeafException):
            self.wm.set_setting("settings.user", "HELLO", Scope.WORKSPACE)
        with self.assertRaises(LeafException):
            self.wm.set_setting("settings.user", "HELLO", Scope.PROFILE)

        self.wm.set_setting("settings.user", "hello")
        self.assertEqual("hello", self.wm.get_setting_value("settings.user"))
        self.assertEqual("hello", self.wm.read_user_configuration().build_environment().find_value("LEAF_SETTING_USER"))

        self.wm.set_setting("settings.user", "hello2", Scope.USER)
        self.assertEqual("hello2", self.wm.get_setting_value("settings.user"))
        self.assertEqual("hello2", self.wm.read_user_configuration().build_environment().find_value("LEAF_SETTING_USER"))

    def test_resolve_latest(self):
        self.assertEqual(2, len(self.wm.list_remotes(True)))
        remote2 = self.wm.list_remotes()["other"]
        remote2.enabled = False
        self.wm.update_remote(remote2)
        self.assertEqual(1, len(self.wm.list_remotes(True)))

        self.wm.init_ws()
        profile = self.wm.create_profile("myprofile")
        profile.add_packages(PackageIdentifier.parse_list(["testlatest_1.0"]))
        self.wm.update_profile(profile)
        self.wm.provision_profile(profile)
        self.check_installed_packages(["testlatest_1.0", "version_1.1"])
        self.check_profile_content("myprofile", ["testlatest", "version"])

        remote2 = self.wm.list_remotes()["other"]
        remote2.enabled = True
        self.wm.update_remote(remote2)
        self.assertEqual(2, len(self.wm.list_remotes(True)))
        self.wm.fetch_remotes()

        self.wm.provision_profile(profile)
        self.check_installed_packages(["testlatest_1.0", "version_1.1", "version_2.0"])
        self.check_profile_content("myprofile", ["testlatest", "version"])

    def test_sync_with_package_not_available(self):
        self.wm.init_ws()

        self.assertEqual(len(self.wm.list_remotes(only_enabled=True)), 2)
        self.assertTrue(PackageIdentifier.parse("container-A_1.0") in self.wm.list_available_packages())

        profile = self.wm.create_profile("myprofile")
        profile.add_packages(PackageIdentifier.parse_list(["container-A_1.0"]))
        self.wm.update_profile(profile)
        self.wm.provision_profile(profile)
        self.assertTrue(self.wm.is_profile_sync(profile))

        remote2 = self.wm.list_remotes()["default"]
        remote2.enabled = False
        self.wm.update_remote(remote2)
        self.assertEqual(len(self.wm.list_remotes(only_enabled=True)), 1)
        self.assertFalse(PackageIdentifier.parse("container-A_1.0") in self.wm.list_available_packages())

        profile = self.wm.create_profile("myprofile2")
        profile.add_packages(PackageIdentifier.parse_list(["container-A_1.0"]))
        self.wm.update_profile(profile)
        self.wm.provision_profile(profile)
        self.assertTrue(self.wm.is_profile_sync(profile))
Example #7
0
def complete_profiles(*args, **kwargs):
    wm = WorkspaceManager(WorkspaceManager.find_root())
    if wm.is_initialized:
        return wm.list_profiles().keys()