@@ -178,11 +178,13 @@ def get_installed_packages(self):
178178 LOG .trace (utils .get_exception_details ())
179179 self .installed_packages = []
180180
181- def _yum_install (self , package_names , enable_repos = [] ):
181+ def _yum_install (self , package_names ):
182182 try :
183- yum_cmd = 'yum install %s -y%s' % (
183+ yum_cmd = 'yum install %s -y %s %s' % (
184184 " " .join (package_names ),
185- "" .join ([" --enablerepo=%s" % r for r in enable_repos ]))
185+ "--setopt=strict=1" ,
186+ "--setopt=skip_missing_names_on_install=0"
187+ )
186188 self ._exec_cmd_chroot (yum_cmd )
187189 except exception .CoriolisException as err :
188190 raise exception .FailedPackageInstallationException (
@@ -200,60 +202,40 @@ def _yum_uninstall(self, package_names):
200202 error = str (err )) from err
201203
202204 def _yum_clean_all (self ):
203- self ._exec_cmd_chroot ("yum clean all" )
205+ try :
206+ self ._exec_cmd_chroot ("yum clean all" )
207+ except exception .CoriolisException :
208+ # On systems with no enabled repos, yum clean fails with
209+ # "There are no enabled repos". This is non-fatal since
210+ # there is nothing to clean.
211+ LOG .warning ("yum clean all failed (e.g. no enabled repos), "
212+ "continuing. Error: %s" , utils .get_exception_details ())
204213 if self ._test_path ('var/cache/yum' ):
205214 self ._exec_cmd_chroot ("rm -rf /var/cache/yum" )
206215
207- def _find_yum_repos (self , repos_to_enable = []):
208- """
209- Looks for required repositories passed as `repos_to_enable` in
210- /etc/yum.repos.d and returns the found repository names, so they can
211- be temporarily enabled when installing packages using yum.
212-
213- Yum only looks for repos in files with '.repo' extension, anything
214- else gets ignored, therefore this method should filter files by that
215- extension.
216-
217- Also, yum repository names might be different in some guest releases,
218- but still be similar. Therefore, repo name substrings should ideally be
219- passed in `repos_to_enable`. For example, we might be looking for repo
220- name 'ol7_latest', but the guest has it named as 'public_ol7_latest' in
221- the repo file.
222- """
223- found_repos = []
216+ def _get_repos_to_enable (self ):
217+ return []
224218
225- reposdir_path = 'etc/yum.repos.d'
219+ def enable_repos (self , repo_names ):
220+ """Enable repositories using subscription-manager for
221+ Red Hat Enterprise Linux.
226222
227- repofiles = [
228- f for f in self ._list_dir (reposdir_path ) if f .endswith ('.repo' )]
229- installed_repos = []
230- for file in repofiles :
231- path = os .path .join (reposdir_path , file )
232- try :
233- content = self ._read_file_sudo (path )
234- except Exception as e :
235- LOG .warning (
236- "Could not read yum repository file %s: %s" , path , e )
237- continue
238- for line in content .splitlines ():
239- m = re .match (r'^\[(.+)\]$' , line )
240- if m :
241- installed_repos .append (m .group (1 ))
242-
243- for repo in repos_to_enable :
244- available_repos = [ir for ir in installed_repos if repo in ir ]
245- available_repos .sort (key = len )
246- if available_repos :
247- found_repos .append (available_repos [0 ])
248- else :
249- LOG .warn (
250- "Could not find yum repository while searching for "
251- "repositories to enable: %s." , repo )
252-
253- return found_repos
223+ This method should be overridden by subclasses that use different
224+ repository management tools.
225+ """
226+ if not repo_names :
227+ return
254228
255- def _get_repos_to_enable (self ):
256- return []
229+ # RHEL uses subscription-manager for all versions
230+ for repo in repo_names :
231+ cmd = 'subscription-manager repos --enable=%s' % repo
232+ try :
233+ self ._exec_cmd_chroot (cmd )
234+ LOG .info ("Enabled repository '%s' using subscription-manager" ,
235+ repo )
236+ except exception .CoriolisException :
237+ LOG .warning (f"Failed to enable repository { repo } . "
238+ f"Error was: { utils .get_exception_details ()} " )
257239
258240 def pre_packages_install (self , package_names ):
259241 super (BaseRedHatMorphingTools , self ).pre_packages_install (
@@ -271,8 +253,9 @@ def post_packages_install(self, package_names):
271253 package_names )
272254
273255 def install_packages (self , package_names ):
274- enable_repos = self ._get_repos_to_enable ()
275- self ._yum_install (package_names , enable_repos )
256+ repos_to_enable = self ._get_repos_to_enable ()
257+ self .enable_repos (repos_to_enable )
258+ self ._yum_install (package_names )
276259
277260 def uninstall_packages (self , package_names ):
278261 self ._yum_uninstall (package_names )
0 commit comments