@@ -185,11 +185,13 @@ def get_installed_packages(self):
185185 LOG .trace (utils .get_exception_details ())
186186 self .installed_packages = []
187187
188- def _yum_install (self , package_names , enable_repos = [] ):
188+ def _yum_install (self , package_names ):
189189 try :
190- yum_cmd = 'yum install %s -y%s' % (
190+ yum_cmd = 'yum install %s -y %s %s' % (
191191 " " .join (package_names ),
192- "" .join ([" --enablerepo=%s" % r for r in enable_repos ]))
192+ "--setopt=strict=1" ,
193+ "--setopt=skip_missing_names_on_install=0"
194+ )
193195 self ._exec_cmd_chroot (yum_cmd )
194196 except exception .CoriolisException as err :
195197 raise exception .FailedPackageInstallationException (
@@ -207,60 +209,40 @@ def _yum_uninstall(self, package_names):
207209 error = str (err )) from err
208210
209211 def _yum_clean_all (self ):
210- self ._exec_cmd_chroot ("yum clean all" )
212+ try :
213+ self ._exec_cmd_chroot ("yum clean all" )
214+ except exception .CoriolisException :
215+ # On systems with no enabled repos, yum clean fails with
216+ # "There are no enabled repos". This is non-fatal since
217+ # there is nothing to clean.
218+ LOG .warning ("yum clean all failed (e.g. no enabled repos), "
219+ "continuing. Error: %s" , utils .get_exception_details ())
211220 if self ._test_path ('var/cache/yum' ):
212221 self ._exec_cmd_chroot ("rm -rf /var/cache/yum" )
213222
214- def _find_yum_repos (self , repos_to_enable = []):
215- """
216- Looks for required repositories passed as `repos_to_enable` in
217- /etc/yum.repos.d and returns the found repository names, so they can
218- be temporarily enabled when installing packages using yum.
219-
220- Yum only looks for repos in files with '.repo' extension, anything
221- else gets ignored, therefore this method should filter files by that
222- extension.
223-
224- Also, yum repository names might be different in some guest releases,
225- but still be similar. Therefore, repo name substrings should ideally be
226- passed in `repos_to_enable`. For example, we might be looking for repo
227- name 'ol7_latest', but the guest has it named as 'public_ol7_latest' in
228- the repo file.
229- """
230- found_repos = []
223+ def _get_repos_to_enable (self ):
224+ return []
231225
232- reposdir_path = 'etc/yum.repos.d'
226+ def enable_repos (self , repo_names ):
227+ """Enable repositories using subscription-manager for
228+ Red Hat Enterprise Linux.
233229
234- repofiles = [
235- f for f in self ._list_dir (reposdir_path ) if f .endswith ('.repo' )]
236- installed_repos = []
237- for file in repofiles :
238- path = os .path .join (reposdir_path , file )
239- try :
240- content = self ._read_file_sudo (path )
241- except Exception as e :
242- LOG .warning (
243- "Could not read yum repository file %s: %s" , path , e )
244- continue
245- for line in content .splitlines ():
246- m = re .match (r'^\[(.+)\]$' , line )
247- if m :
248- installed_repos .append (m .group (1 ))
249-
250- for repo in repos_to_enable :
251- available_repos = [ir for ir in installed_repos if repo in ir ]
252- available_repos .sort (key = len )
253- if available_repos :
254- found_repos .append (available_repos [0 ])
255- else :
256- LOG .warn (
257- "Could not find yum repository while searching for "
258- "repositories to enable: %s." , repo )
259-
260- return found_repos
230+ This method should be overridden by subclasses that use different
231+ repository management tools.
232+ """
233+ if not repo_names :
234+ return
261235
262- def _get_repos_to_enable (self ):
263- return []
236+ # RHEL uses subscription-manager for all versions
237+ for repo in repo_names :
238+ cmd = 'subscription-manager repos --enable=%s' % repo
239+ try :
240+ self ._exec_cmd_chroot (cmd )
241+ LOG .info ("Enabled repository '%s' using subscription-manager" ,
242+ repo )
243+ except exception .CoriolisException :
244+ LOG .warning (f"Failed to enable repository { repo } . "
245+ f"Error was: { utils .get_exception_details ()} " )
264246
265247 def pre_packages_install (self , package_names ):
266248 super (BaseRedHatMorphingTools , self ).pre_packages_install (
@@ -278,8 +260,9 @@ def post_packages_install(self, package_names):
278260 package_names )
279261
280262 def install_packages (self , package_names ):
281- enable_repos = self ._get_repos_to_enable ()
282- self ._yum_install (package_names , enable_repos )
263+ repos_to_enable = self ._get_repos_to_enable ()
264+ self .enable_repos (repos_to_enable )
265+ self ._yum_install (package_names )
283266
284267 def uninstall_packages (self , package_names ):
285268 self ._yum_uninstall (package_names )
0 commit comments