
    p
f(                     p    d dl Z d dlZd dlZd dlZd dlmc mZ d dlmc mc m	Z	 d dl
mZ  G d de      Zy)    N)RDMAHandlerc                       e Zd ZdZdZdZdZdZdZdZ	d Z
d Zd	 Zed
        Zd Zd Zd Zed        Zed        Zd Zd Zed        Zd Zed        Zd Zd Zy)CentOSRDMAHandlerzmicrosoft-hyper-v-rdmazkmod-microsoft-hyper-v-rdmazmsft-rdma-drivers
hypervkvpdzmicrosoft-hyper-vNc                     |j                  d      }t        |      dk  rt        d|z        |d   |d   c| _        | _        y )N.   zUnexpected centos version: %sr      )splitlen	Exceptionversion_majorversion_minor)selfdistro_versionvs      @/usr/lib/python3/dist-packages/azurelinuxagent/pa/rdma/centos.py__init__zCentOSRDMAHandler.__init__(   sH      %q6A:;nLMM121qt.D.    c                    t        j                  d       t        j                         }t	        j
                  d|z         |s| j                          t        j                  d       | j                         }|st        d      t	        j
                  dj                  |             | j                  |      }| j                         }|rst	        j
                  dj                  |             | j                  ||      rt	        j
                  d       yt	        j
                  d       | j                  |       yt	        j
                  d	       | j                  |       y)
zo
        Install the KVP daemon and the appropriate RDMA driver package for the
        RDMA firmware.
        
   zRDMA: kvp daemon running: %sz&Cannot determine RDMA firmware versionz!RDMA: found firmware version: {0}z!RDMA: driver package present: {0}z"RDMA: driver package is up-to-dateNz#RDMA: driver package needs updatingz%RDMA: driver package is NOT installed)timesleepr   is_kvp_daemon_runningloggerinfocheck_or_install_kvp_daemonget_rdma_versionr   formatget_int_rdma_versionget_rdma_package_infois_rdma_package_up_to_dateupdate_rdma_package)r   kvpd_running
fw_versioninstalled_pkgs       r   install_driverz CentOSRDMAHandler.install_driver.   s    	

2"88:2\AB,,.

2 **,
DEE7>>zJK..z:
224KK3::=IK..}jI@AAB((4KK?@$$Z0r   c                 f    dj                  | j                  |      }t        j                  ||      S )Nz{0}-(\d+\.){{3,}}({1})-)r   rdma_user_mode_package_namerematch)r   pkgr%   patterns       r   r"   z,CentOSRDMAHandler.is_rdma_package_up_to_dateQ   s.     -33D4T4TV`axx%%r   c                 f    | j                  d      }t        |      dk(  rt        d| z        |d   S )Nr   r   z&Unexpected RDMA firmware version: "%s")r   r   r   )versionss     r   r    z&CentOSRDMAHandler.get_int_rdma_versionX   s5    MM#q6Q;DwNOOtr   c                 `    t        j                  d| j                  z  d      \  }}|dk7  ry|S )zA
        Returns the installed rdma package name or None
        	rpm -q %sFchk_errr   N)	shellutilrun_get_outputr)   )r   retoutputs      r   r!   z'CentOSRDMAHandler.get_rdma_package_info_   s8      ..$:::EKV!8r   c                     t        j                  d       | j                          | j                  | j                         | j                  |       y )NzRDMA: updating RDMA packages)r   r   refresh_reposforce_install_packagerdma_wrapper_package_nameinstall_rdma_drivers)r   r%   s     r   r#   z%CentOSRDMAHandler.update_rdma_packagei   s=    23""4#A#AB!!*-r   c                    t        j                  d|z         | j                  |      dk7  rt        j                  d       | j                  |      dk7  rt	        dj                  |            t        j                  d|z         y)zN
        Attempts to remove existing package and installs the package
        z"RDMA: Force installing package: %sr   z.RDMA: Erasing package failed but will continuezFailed to install package "{0}"z RDMA: installation completed: %sN)r   r   uninstall_packageinstall_packager   r   )r   pkg_names     r   r;   z'CentOSRDMAHandler.force_install_packageo   sr     	88CD!!(+q0KKHI)Q.=DDXNOO6ABr   c                 J    t        j                  dj                  |             S )Nzyum erase -y -q {0}r5   runr   rA   s    r   r?   z#CentOSRDMAHandler.uninstall_packagez   s    }}299(CDDr   c                 J    t        j                  dj                  |             S )Nzyum install -y -q {0}rC   rE   s    r   r@   z!CentOSRDMAHandler.install_package~   s    }}4;;HEFFr   c                     t        j                  d       t        j                  d      dk7  rt	        d      t        j                  d      dk7  rt	        d      t        j                  d       y )NzRDMA: refreshing yum reposzyum clean allr   z Cleaning yum repositories failedzyum updateinfoz,Failed to act on yum repo update informationzRDMA: repositories refreshed)r   r   r5   rD   r   )r   s    r   r:   zCentOSRDMAHandler.refresh_repos   sW    01==)Q.>??==)*a/JKK23r   c                    dj                  | j                  | j                        }t        j                  dj                  |             t
        j                  j                  |      st        d|z        t        j                  |      }t        j                  dt        |      z         | j                          | j                  || j                  d|d      }|st        d      t
        j                  j                  ||      }| j                  d| j                  |       | j                  || j                   d|d      }|st        d	      t
        j                  j                  ||      }| j                  d
| j                   |       t        j                  d       | j#                         r| j%                         s&t        j                  d       | j'                          yt        j                  d       y)z
        Installs the drivers from /opt/rdma/rhel[Major][Minor] directory,
        particularly the microsoft-hyper-v-rdma-* kmod-* and (no debuginfo or
        src). Tries to uninstall them first.
        z/opt/microsoft/rdma/rhel{0}{1}zRDMA: pkgs dir: {0}z%RDMA packages directory %s is missingz)RDMA: found %d files in package directoryz-(\d+\.){3,}(z)-\d{8}\.x86_64.rpmz"RDMA kernel mode package not foundzkernel modez RDMA user mode package not foundz	user modezRDMA: driver packages installedz2RDMA: driver module is not loaded; reboot requiredzRDMA: kernel module is loadedN)r   r   r   r   r   ospathisdirr   listdirr   &uninstall_kvp_driver_package_if_existsget_file_by_patternrdma_kernel_mode_package_namejoinuninstall_pkg_and_install_fromr)   load_driver_moduleis_driver_loadedreboot_system)r   r%   pkg_dirpkgskmod_pkgkmod_pkg_pathumod_pkgumod_pkg_paths           r   r=   z&CentOSRDMAHandler.install_rdma_drivers   s    399 2 24)009:ww}}W%CgMNNzz'"?#d)KL 	335 ++T=_=_akln@AAWh7++4==}	N ++T=]=]_ijl>??Wh7++99=	J 	56&&(0E0E0GKKLM KK78r   c                 F    | D ]  }t        j                  ||      s|c S  y )N)r*   r+   )	file_listr-   ls      r   rN   z%CentOSRDMAHandler.get_file_by_pattern   s)     	Axx#	 r   c                 |   t        j                  dj                  ||             t        j                  d|z         | j                  |      dk(  rt        j                  d|z         t        j                  dj                  ||             | j	                  |      dk7  rt        dj                  |            y )Nz RDMA: Processing {0} driver: {1}z+RDMA: Try to uninstall existing version: %sr   z RDMA: Successfully uninstaled %sz%RDMA: Installing {0} package from {1}z"Failed to install RDMA {0} package)r   r   r   r?   r@   r   )r   pkg_typerA   pkg_paths       r   rQ   z0CentOSRDMAHandler.uninstall_pkg_and_install_from   s    .55hI	KAHLM!!(+q0KK:XEF3::8XN	P)Q.4;;HEG G /r   c                 <    t        j                  d| z  d      dk(  S )zPRuns rpm -q and checks return code to find out if a package
        is installedr2   Fr3   r   )r5   rD   )r,   s    r   is_package_installedz&CentOSRDMAHandler.is_package_installed   s     }}[3.>!CCr   c                    t        j                  d       | j                  | j                  g}|D ]  }| j	                  |      st        j                  d|z         -t        j                  d|z         t        j                  d|z  d      dk(  rt        j                  d       xt        j                  d	        y )
Nz+RDMA: deleting existing kvp driver packagesz-RDMA: kvp package %s does not exist, skippingzRDMA: erasing kvp package "%s"zyum erase -q -y %sFr3   r   z!RDMA: successfully erased packagezRDMA: failed to erase package)r   r   hyper_v_package_namehyper_v_package_name_newrb   r5   rD   error)r   kvp_pkgskvp_pkgs      r   rM   z8CentOSRDMAHandler.uninstall_kvp_driver_package_if_exists   s    AB--113   		BG,,W5CgMO <wFG==!5!?OSTTKK CDLL!@A		Br   c                    t        j                  d       | j                  | j                  g}|D ];  }t        j                  d|z         | j	                  |      }|s/t        d|z         | j                  }t        j                  d|z         t        j                  d|z         | j                  |      dk7  rt        d|z        t        j                  d|z         t        j                  d	       | j                          y
)zpChecks if kvp daemon package is installed, if not installs the
        package and reboots the machine.
        z#RDMA: Checking kvp daemon packages.z&RDMA: Checking if package %s installedz@RDMA: package %s is installed, but the kvp daemon is not runningz1RDMA: no kvp drivers installed, will install '%s'z(RDMA: trying to install kvp package '%s'r   z/RDMA: failed to install kvp daemon package '%s'z)RDMA: package '%s' successfully installedz#RDMA: Machine will now be rebooted.N)r   r   rd   re   rb   r   r@   rT   )r   rg   r,   	installedkvp_pkg_to_installs        r   r   z-CentOSRDMAHandler.check_or_install_kvp_daemon   s     	9:--113  	jCKK@3FG11#6I beh hii		j  44GJ\\]>ASST 23q8MPbbcc?BTTU9:r   )__name__
__module____qualname__r)   rO   r<   rd   re   r   r   r   r'   r"   staticmethodr    r!   r#   r;   r?   r@   r:   r=   rN   rQ   rb   rM   r    r   r   r   r      s    ":$A! 3'2MM<!1F&  .	C E E G G4)9V  
G D D
B"r   r   )globrI   r*   r   azurelinuxagent.common.loggercommonr   &azurelinuxagent.common.utils.shellutilutilsr5   azurelinuxagent.common.rdmar   r   rp   r   r   <module>rw      s0   (  	 	  . . : : 3W Wr   