URL: https://github.com/freeipa/freeipa/pull/5018
Author: abbra
 Title: #5018: [Backport][ipa-4-8] Treat container subplatforms like main 
platform
Action: opened

PR body:
"""
This PR was opened automatically because PR #4992 was pushed to master and 
backport to ipa-4-8 is required.
"""

To pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/5018/head:pr5018
git checkout pr5018
From 5a09058683b77bef6cb4497f8aec874ce3977724 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Wed, 5 Aug 2020 12:27:59 +0200
Subject: [PATCH] Treat container subplatforms like main platform

ipa-server-upgrade does not like platform mismatches. Upgrade from an
old container to recent container fails with error message:

```
  IPA server upgrade failed: Inspect /var/log/ipaupgrade.log and run command ipa-server-upgrade manually.
  ("Unable to execute IPA upgrade: platform mismatch (expected 'fedora', current 'fedora_container')", 1)
```

Upgrade state now treats a container subplatform like its main platform.
``fedora_container`` is really a ``fedora`` platform with some paths
redirected to ``/data`` partition.

The patch also enhances debug logging for installer and upgrader.

Related: https://pagure.io/freeipa/issue/8401
Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 ipapython/admintool.py                        |  3 +++
 ipaserver/install/installutils.py             | 25 +++++++++++++++----
 .../test_install/test_installutils.py         | 16 ++++++++++++
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/ipapython/admintool.py b/ipapython/admintool.py
index ededb28bfd..991e85e016 100644
--- a/ipapython/admintool.py
+++ b/ipapython/admintool.py
@@ -28,6 +28,7 @@
 import traceback
 from optparse import OptionGroup  # pylint: disable=deprecated-module
 
+from ipaplatform.osinfo import osinfo
 from ipapython import version
 from ipapython import config
 from ipapython.ipa_log_manager import standard_logging_setup
@@ -304,6 +305,8 @@ def run(self):
         logger.debug('%s was invoked with arguments %s and options: %s',
                      self.command_name, self.args, self.safe_options)
         logger.debug('IPA version %s', version.VENDOR_VERSION)
+        logger.debug('IPA platform %s', osinfo.platform)
+        logger.debug('IPA os-release %s %s', osinfo.name, osinfo.version)
 
     def log_failure(self, error_message, return_value, exception, backtrace):
         logger.debug('%s', ''.join(traceback.format_tb(backtrace)))
diff --git a/ipaserver/install/installutils.py b/ipaserver/install/installutils.py
index ce57772ff8..583b1aca0b 100644
--- a/ipaserver/install/installutils.py
+++ b/ipaserver/install/installutils.py
@@ -1054,13 +1054,26 @@ def load_external_cert(files, ca_subject):
     return cert_file, ca_file
 
 
+def get_current_platform():
+    """Get current platform (without container suffix)
+
+    'fedora' and 'fedora_container' are considered the same platform. This
+    normalization ensures that older freeipa-container images can be upgraded
+    without a platform mismatch.
+    """
+    platform = ipaplatform.NAME
+    if platform.endswith('_container'):
+        platform = platform[:-10]
+    return platform
+
+
 def store_version():
     """Store current data version and platform. This is required for check if
     upgrade is required.
     """
     sysupgrade.set_upgrade_state('ipa', 'data_version',
                                  version.VENDOR_VERSION)
-    sysupgrade.set_upgrade_state('ipa', 'platform', ipaplatform.NAME)
+    sysupgrade.set_upgrade_state('ipa', 'platform', get_current_platform())
 
 
 def check_version():
@@ -1070,12 +1083,14 @@ def check_version():
     :raise UpgradeDataNewerVersionError: older version of IPA was detected than data
     :raise UpgradeMissingVersionError: if platform or version is missing
     """
-    platform = sysupgrade.get_upgrade_state('ipa', 'platform')
-    if platform is not None:
-        if platform != ipaplatform.NAME:
+    state_platform = sysupgrade.get_upgrade_state('ipa', 'platform')
+    current_platform = get_current_platform()
+    if state_platform is not None:
+        if state_platform != current_platform:
             raise UpgradePlatformError(
                 "platform mismatch (expected '%s', current '%s')" % (
-                platform, ipaplatform.NAME)
+                    state_platform, current_platform
+                )
             )
     else:
         raise UpgradeMissingVersionError("no platform stored")
diff --git a/ipatests/test_ipaserver/test_install/test_installutils.py b/ipatests/test_ipaserver/test_install/test_installutils.py
index 86e595167e..739a64f470 100644
--- a/ipatests/test_ipaserver/test_install/test_installutils.py
+++ b/ipatests/test_ipaserver/test_install/test_installutils.py
@@ -140,3 +140,19 @@ def test_gpg_asymmetric(tempdir, gpgkey):
     assert os.path.isfile(src)
     with open(src) as f:
         assert f.read() == payload
+
+
+@pytest.mark.parametrize(
+    "platform, expected",
+    [
+        ("fedora", "fedora"),
+        ("fedora_container", "fedora"),
+        ("fedora_containers", "fedora_containers"),
+        ("fedoracontainer", "fedoracontainer"),
+        ("rhel", "rhel"),
+        ("rhel_container", "rhel"),
+    ]
+)
+def test_get_current_platform(monkeypatch, platform, expected):
+    monkeypatch.setattr(installutils.ipaplatform, "NAME", platform)
+    assert installutils.get_current_platform() == expected
_______________________________________________
FreeIPA-devel mailing list -- freeipa-devel@lists.fedorahosted.org
To unsubscribe send an email to freeipa-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/freeipa-devel@lists.fedorahosted.org

Reply via email to