U
    ¯Ad"  ã                	   @   sø   U d Z ddlZddlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ dZdddeegeg g dœZeed< dZ dZdZdZe e¡ZdZeee	eeddœdd„Zdd„ Zdd„ Z dd„ Z!dd„ Z"d d!„ Z#dS )"zReset RMC: Reset rsct node idé    N)ÚLogger)Úlog)ÚsubpÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚALL_DISTROS)ÚPER_INSTANCEa|  Reset RMC module is IBM PowerVM Hypervisor specific

Reliable Scalable Cluster Technology (RSCT) is a set of software components,
that  together provide a comprehensive clustering environment (RAS features)
for IBM PowerVM based virtual machines. RSCT includes the Resource monitoring
and control (RMC) subsystem. RMC is a generalized framework used for managing,
monitoring, and manipulating resources. RMC runs as a daemon process on
individual machines and needs creation of unique node id and restarts
during VM boot.
More details refer
https://www.ibm.com/support/knowledgecenter/en/SGVKBA_3.2/admin/bl503_ovrv.htm

This module handles
- creation of the unique RSCT node id to every instance/virtual machine
  and ensure once set, it isn't changed subsequently by cloud-init.
  In order to do so, it restarts RSCT service.

Prerequisite of using this module is to install RSCT packages.
Zcc_reset_rmcz	Reset RMCzreset rsct node id)ÚidÚnameÚtitleZdescriptionZdistrosZ	frequencyZexamplesZactivate_by_schema_keysÚmetaÚ z/opt/rsct/install/binÚrmcctrlZrecfgctz/etc/ct_node_id)r   ÚcfgÚcloudr   ÚargsÚreturnc              	   C   sr   |j jdkrt d¡ d S tj t¡s4t d¡ d S tj 	d¡}zt
|ƒ tƒ  W 5 |rd|tjd< ntjd= X d S )NZnonez(Skipping creation of new ct_node_id nodez&module disabled, RSCT_PATH not presentÚPATH)Z
datasourceZplatform_typeÚLOGÚdebugÚosÚpathÚisdirÚ	RSCT_PATHÚenvironÚgetÚadd_pathÚ	reset_rmc)r   r   r   r   r   Ú	orig_path© r!   ú?/usr/lib/python3/dist-packages/cloudinit/config/cc_reset_rmc.pyÚhandleD   s    


r#   c                  C   sN   z$t   tg¡d } t |  ¡ ¡ | W S  t jk
rH   t td¡ ‚ Y nX d S )Nr   z*Failed to reconfigure the RSCT subsystems.)r   ÚRECFGCTr   r   ÚstripZProcessExecutionErrorr   Úlogexc)Úoutr!   r!   r"   Úreconfigure_rsct_subsystems[   s    r(   c                  C   sJ   zt  t¡} |  d¡d }|W S  tk
rD   t  tdt ¡ ‚ Y nX d S )NÚ
r   z#Failed to get node ID from file %s.)r   Z	load_fileÚNODE_ID_FILEÚsplitÚ	Exceptionr&   r   )ÚfpZnode_idr!   r!   r"   Úget_node_idh   s    
r.   c                 C   s(   | rd|  nd}t | tjd< tjd S )Nú:r   r   )r   r   r   )r    Zsuffr!   r!   r"   r   r   s    r   c                   C   s8   zt   tdg¡W S  tk
r2   t td¡ ‚ Y nX d S )Nz-zz!Failed to stop the RMC subsystem.)r   ÚRMCCTRLr,   r   r&   r   r!   r!   r!   r"   r   {   s
    c                  C   s\   t  d¡ tƒ } t  d| ¡ tƒ  tƒ  tƒ }t  d|¡ || krXd}t  |¡ t|ƒ‚d S )NzAttempting to reset RMC.z"Node ID at beginning of module: %szNode ID at end of module: %sz"New node ID did not get generated.)r   r   r.   r   r(   Úerrorr,   )Znode_id_beforeZnode_id_afterÚmsgr!   r!   r"   r   …   s    

r   )$Ú__doc__r   Zloggingr   Z	cloudinitr   r   r   Zcloudinit.cloudr   Zcloudinit.configr   Zcloudinit.config.schemar   Zcloudinit.distrosr	   Zcloudinit.settingsr
   ZMODULE_DESCRIPTIONr   Ú__annotations__r   r0   r$   Z	getLoggerÚ__name__r   r*   ÚstrÚlistr#   r(   r.   r   r   r   r!   r!   r!   r"   Ú<module>   sJ   ø
    þ
	
