Exemple #1
0
    def _upgrade(
            self,
            new_src_ver: SourceVersion,
            pkg_name: str,
            migrate=True,
            rollback=True
    ):
        curr_pkg_ver, _ = NodeControlUtil.curr_pkg_info(pkg_name)

        if not curr_pkg_ver:
            logger.error("package {} is not found".format(pkg_name))
            return

        logger.info(
            "Current version of package '{}' is '{}'"
            .format(pkg_name, curr_pkg_ver)
        )

        new_pkg_ver = NodeControlUtil.get_latest_pkg_version(
            pkg_name, upstream=new_src_ver)
        if not new_pkg_ver:
            logger.error(
                "Upgrade from {} to upstream version {} failed: package {} for"
                " upstream version is not found"
                .format(curr_pkg_ver, new_src_ver, pkg_name)
            )
            return

        self._do_upgrade(pkg_name, curr_pkg_ver, new_pkg_ver, rollback)
    def get_src_version(pkg_name: str = APP_NAME,
                        nocache: bool = False) -> SourceVersion:

        if pkg_name == APP_NAME and not nocache:
            from indy_node.__metadata__ import __version__
            return src_version_cls(APP_NAME)(__version__)

        curr_pkg_ver, _ = NodeControlUtil.curr_pkg_info(pkg_name)
        return curr_pkg_ver.upstream if curr_pkg_ver else None
Exemple #3
0
def test_curr_pkg_info(monkeypatch):
    output = 'Version: 1.2.3\nDepends: aaa (= 1.2.4), bbb (>= 1.2.5), ccc, aaa'
    expected_deps = ['aaa=1.2.4', 'bbb=1.2.5', 'ccc']
    monkeypatch.setattr(NodeControlUtil, 'run_shell_command',
                        lambda *_: output)

    for pkg_name in [APP_NAME, 'any_package']:
        upstream_cls = src_version_cls(pkg_name)
        expected_version = DebianVersion('1.2.3', upstream_cls=upstream_cls)

        pkg_info = NodeControlUtil.curr_pkg_info(pkg_name)

        assert expected_version == pkg_info[0]
        assert isinstance(expected_version, type(pkg_info[0]))
        assert isinstance(expected_version.upstream,
                          type(pkg_info[0].upstream))
        assert expected_deps == pkg_info[1]
    def didLastExecutedUpgradeSucceeded(self) -> bool:
        """
        Checks last record in upgrade log to find out whether it
        is about scheduling upgrade. If so - checks whether current version
        is equals to the one in that record

        :returns: upgrade execution result
        """
        lastEventInfo = self.lastActionEventInfo
        if lastEventInfo:
            ev_data = lastEventInfo.data
            currentPkgVersion = NodeControlUtil.curr_pkg_info(
                ev_data.pkg_name)[0]
            if currentPkgVersion:
                return currentPkgVersion.upstream == ev_data.version
            else:
                logger.warning("{} failed to get information about package {} "
                               "scheduled for last upgrade".format(
                                   self, ev_data.pkg_name))
        return False
    def check_upgrade_possible(pkg_name: str,
                               target_ver: str,
                               reinstall: bool = False):
        version_cls = src_version_cls(pkg_name)

        try:
            target_ver = version_cls(target_ver)
        except InvalidVersionError:
            return ("invalid target version {} for version class {}: ".format(
                target_ver, version_cls))

        # get current installed package version of pkg_name
        curr_pkg_ver, cur_deps = NodeControlUtil.curr_pkg_info(pkg_name)
        if not curr_pkg_ver:
            return ("package {} is not installed and cannot be upgraded".
                    format(pkg_name))

        # TODO weak check
        if APP_NAME not in pkg_name and all(
            [APP_NAME not in d for d in cur_deps]):
            return "Package {} doesn't belong to pool".format(pkg_name)

        # compare whether it makes sense to try (target >= current, = for reinstall)
        if not Upgrader.is_version_upgradable(curr_pkg_ver.upstream,
                                              target_ver, reinstall):
            return "Version {} is not upgradable".format(target_ver)

        # get the most recent version of the package for provided version
        # TODO request to NodeControlTool since Node likely runs under user
        # which doesn't have rights to update list of system packages available
        # target_pkg_ver = NodeControlUtil.get_latest_pkg_version(
        #    pkg_name, upstream=target_ver)

        # if not target_pkg_ver:
        #    return ("package {} for target version {} is not found"
        #            .format(pkg_name, target_ver))

        return None
Exemple #6
0
def test_curr_pkg_info_no_data(monkeypatch):
    monkeypatch.setattr(NodeControlUtil, 'run_shell_command', lambda *_: '')
    assert (None, []) == NodeControlUtil.curr_pkg_info('any_package')