Răsfoiți Sursa

Merge pull request #224 from Dany9966/yum-repofiles

Fix yum repos bugs
Nashwan Azhari 4 ani în urmă
părinte
comite
a94ff56caf
2 a modificat fișierele cu 41 adăugiri și 12 ștergeri
  1. 10 8
      coriolis/osmorphing/oracle.py
  2. 31 4
      coriolis/osmorphing/redhat.py

+ 10 - 8
coriolis/osmorphing/oracle.py

@@ -1,6 +1,8 @@
 # Copyright 2016 Cloudbase Solutions Srl
 # All Rights Reserved.
 
+import uuid
+
 from coriolis.osmorphing import redhat
 from coriolis.osmorphing.osdetect import oracle as oracle_detect
 
@@ -26,15 +28,15 @@ class BaseOracleMorphingTools(redhat.BaseRedHatMorphingTools):
         repos = []
         major_version = int(self._version.split(".")[0])
         if major_version < 8:
-            self._yum_install(
-                ['yum-utils'],
-                self._find_yum_repos(['ol%s_latest' % major_version]))
-            # TODO(apilotti): for ULN users, use the corresponding repos
-            # e.g.: ol7_x86_64_addons
+            repo_file_path = (
+                '/etc/yum.repos.d/%s.repo' % str(uuid.uuid4()))
+            self._exec_cmd_chroot(
+                "curl -L http://public-yum.oracle.com/public-yum-ol%s.repo "
+                "-o %s" % (major_version, repo_file_path))
+            # During OSMorphing, we temporarily enable needed package repos,
+            # so we make sure we disable all downloaded repos here.
             self._exec_cmd_chroot(
-                "yum-config-manager --add-repo "
-                "http://public-yum.oracle.com/public-yum-ol%s.repo" %
-                major_version)
+                'sed -i "s/^enabled=1$/enabled=0/g" %s' % repo_file_path)
 
             repos_to_enable = ["ol%s_software_collections" % major_version,
                                "ol%s_addons" % major_version,

+ 31 - 4
coriolis/osmorphing/redhat.py

@@ -217,14 +217,41 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
             self._exec_cmd_chroot("rm -rf /var/cache/yum")
 
     def _find_yum_repos(self, repos_to_enable=[]):
+        """
+        Looks for required repositories passed as `repos_to_enable` in
+        /etc/yum.repos.d and returns the found repository names, so they can
+        be temporarily enabled when installing packages using yum.
+
+        Yum only looks for repos in files with '.repo' extension, anything
+        else gets ignored, therefore this method should filter files by that
+        extension.
+
+        Also, yum repository names might be different in some guest releases,
+        but still be similar. Therefore, repo name substrings should ideally be
+        passed in `repos_to_enable`. For example, we might be looking for repo
+        name 'ol7_latest', but the guest has it named as 'public_ol7_latest' in
+        the repo file.
+        """
         found_repos = []
+
+        reposdir_path = 'etc/yum.repos.d'
+
+        repofiles = [
+            f for f in self._list_dir(reposdir_path) if f.endswith('.repo')]
+        installed_repos = []
+        for file in repofiles:
+            path = os.path.join(reposdir_path, file)
+            content = self._read_file(path).decode()
+            for line in content.splitlines():
+                m = re.match(r'^\[(.+)\]$', line)
+                if m:
+                    installed_repos.append(m.group(1))
+
         for repo in repos_to_enable:
-            cmd = 'egrep "^\[.*%s.*\]$" -R /etc/yum.repos.d | cut -f2 -d:'
-            available_repos = self._exec_cmd_chroot(
-                cmd % repo).decode().splitlines()
+            available_repos = [ir for ir in installed_repos if repo in ir]
             available_repos.sort(key=len)
             if available_repos:
-                found_repos.append(available_repos[0].lstrip('[').rstrip(']'))
+                found_repos.append(available_repos[0])
             else:
                 LOG.warn(
                     "Could not find yum repository while searching for "