
    VhS                         d dl mZmZmZ eZdZdZdZd dl	Z	d dl
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  G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona  
---
module: podman_volume
short_description: Manage Podman volumes
author:
  - "Sagi Shnaidman (@sshnaidm)"
version_added: '1.1.0'
description:
  - Manage Podman volumes
options:
  state:
    description:
      - State of volume, default 'present'
    type: str
    default: present
    choices:
      - present
      - absent
      - mounted
      - unmounted
      - quadlet
  recreate:
    description:
      - Recreate volume even if exists.
    type: bool
    default: false
  name:
    description:
      - Name of volume.
    type: str
    required: true
  label:
    description:
      - Add metadata to a pod volume (e.g., label com.example.key=value).
    type: dict
    required: false
  driver:
    description:
      - Specify volume driver name (default local).
    type: str
    required: false
  options:
    description:
      - Set driver specific options. For example 'device=tpmfs', 'type=tmpfs'.
        UID and GID idempotency is not supported due to changes in podman.
    type: list
    elements: str
    required: false
  executable:
    description:
      - Path to C(podman) executable if it is not in the C($PATH) on the
        machine running C(podman)
    default: 'podman'
    type: str
  debug:
    description:
      - Return additional information which can be helpful for investigations.
    type: bool
    default: False
  quadlet_dir:
    description:
      - Path to the directory to write quadlet file in.
        By default, it will be set as C(/etc/containers/systemd/) for root user,
        C(~/.config/containers/systemd/) for non-root users.
    type: path
    required: false
  quadlet_filename:
    description:
      - Name of quadlet file to write. By default it takes I(name) value.
    type: str
  quadlet_file_mode:
    description:
      - The permissions of the quadlet file.
      - The O(quadlet_file_mode) can be specied as octal numbers or as a symbolic mode (for example, V(u+rwx) or V(u=rw,g=r,o=r)).
        For octal numbers format, you must either add a leading zero so that Ansible's YAML parser knows it is an
        octal number (like V(0644) or V(01777)) or quote it (like V('644') or V('1777')) so Ansible receives a string
        and can do its own conversion from string into number. Giving Ansible a number without following one of these
        rules will end up with a decimal number which will have unexpected results.
      - If O(quadlet_file_mode) is not specified and the quadlet file B(does not) exist, the default V('0640') mask will be used
        when setting the mode for the newly created file.
      - If O(quadlet_file_mode) is not specified and the quadlet file B(does) exist, the mode of the existing file will be used.
      - Specifying O(quadlet_file_mode) is the best way to ensure files are created with the correct permissions.
    type: raw
    required: false
  quadlet_options:
    description:
      - Options for the quadlet file. Provide missing in usual network args
        options as a list of lines to add.
    type: list
    elements: str
    required: false

requirements:
  - "podman"

a  
volume:
  description: Volume inspection results if exists.
  returned: always
  type: dict
  sample:
    CreatedAt: '2023-11-30T16:41:31.310865559+02:00'
    Driver: local
    Labels: {}
    LockNumber: 18
    MountCount: 0
    Mountpoint: /home/user/.local/share/containers/storage/volumes/volname/_data
    Name: volname
    NeedsChown: true
    NeedsCopyUp: true
    Options: {}
    Scope: local

a  
# What modules does for example
- name: Create a volume
  containers.podman.podman_volume:
    state: present
    name: volume1
    label:
      key: value
      key2: value2
    options:
      - "device=/dev/loop1"
      - "type=ext4"

- name: Create a Quadlet file for a volume
  containers.podman.podman_volume:
    state: quadlet
    name: quadlet_volume
    quadlet_filename: custom-name
    quadlet_file_mode: '0640'
    quadlet_options:
      - Group=192
      - Copy=true
      - Image=quay.io/centos/centos:latest

N)AnsibleModule)to_bytes	to_native)LooseVersion)
lower_keys)create_quadlet_statec                   B    e Zd ZdZd Zd Zd Zd ZddZd Z	d	 Z
d
 Zy)PodmanVolumeModuleParamszCreates list of arguments for podman CLI command.

       Arguments:
           action {str} -- action type from 'create', 'delete'
           params {dict} -- dictionary of module parameters

       c                 <    || _         || _        || _        || _        y N)paramsactionpodman_versionmodule)selfr   r   r   r   s        s/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/containers/podman/plugins/modules/podman_volume.py__init__z!PodmanVolumeModuleParams.__init__   s    ,    c                 |    | j                   dv r| j                         S | j                   dv r| j                         S y)zCreate a podman command from given module parameters.

        Returns:
           list -- list of byte strings for Popen command
        )deletemountunmount)createN)r   _simple_action_create_actionr   s    r   construct_command_from_paramsz6PodmanVolumeModuleParams.construct_command_from_params   s@     ;;88&&((;;*$&&(( %r   c                    | j                   dk(  r-dd| j                  d   g}|D cg c]  }t        |d       c}S | j                   dk(  r,d| j                  d   g}|D cg c]  }t        |d       c}S | j                   dk(  r,d| j                  d   g}|D cg c]  }t        |d       c}S y c c}w c c}w c c}w )	Nr   rmz-fnamesurrogate_or_stricterrorsr   r   )r   r   r   )r   cmdis      r   r   z'PodmanVolumeModuleParams._simple_action   s    ;;("t{{623CGJK!HQ'<=KK;;'!DKK/0CGJK!HQ'<=KK;;)#dkk&12CGJK!HQ'<=KK $	 L L Ls   B4!B9B>c           	           j                    j                  d   g}t               D cg c]*  }t        t	         |            r|j                  d      r|, }} fd j                  D        }|D ],  }dj                  d|g      }||v s t	         |      |      }. |D cg c]  }t        |d       c}S c c}w c c}w )Nr#   addparamc              3   B   K   | ]  }j                   |   |  y wr   r   ).0r(   r   s     r   	<genexpr>z:PodmanVolumeModuleParams._create_action.<locals>.<genexpr>   s     KAA0JaKs   _r$   r%   )r   r   dircallablegetattr
startswithjoinr   )r   r'   funcall_param_methods
params_setparam	func_namer(   s   `       r   r   z'PodmanVolumeModuleParams._create_action   s    {{DKK/0.1$i >d (t)< =!%!< " > > LK
 	4E*e!45I--.gdI.s3	4 DGGa#89GG> Hs   /B<%CNc                 P   |rPt        |      t        | j                        kD  r/| j                  j                  d|d|d| j                         |rRt        |      t        | j                        k  r0| j                  j                  d|d|d| j                         y y y )Nz
Parameter z" is supported from podman version z only! Current version is msgz" is supported till podman version )r	   r   r   	fail_json)r   r8   minvmaxvs       r   check_versionz&PodmanVolumeModuleParams.check_version   s    L&##*% %KK!!&+T43F3F'H! I L&##*% %KK!!&+T43F3F'H! I%4r   c                     | j                   d   j                         D ]1  }|ddj                  |D cg c]  }t        |d       c}      gz  }3 |S c c}w )Nlabelz--label   =r$   r%   )r   itemsr4   r   )r   crB   ls       r   addparam_labelz'PodmanVolumeModuleParams.addparam_label   sg    [[)//1 	ME)TYYDIJq!$9:JL M MA	M  Ks   Ac                 *    |d| j                   d   gz   S )Nz--driverdriverr,   )r   rE   s     r   addparam_driverz(PodmanVolumeModuleParams.addparam_driver   s    JH 5666r   c                 <    | j                   d   D ]	  }|d|gz  } |S )Noptionsz--optr,   )r   rE   opts      r   addparam_optionsz)PodmanVolumeModuleParams.addparam_options   s-    ;;y) 	 C'3A	 r   )NN)__name__
__module____qualname____doc__r   r    r   r   r@   rG   rJ   rN    r   r   r   r      s2    	)	L
H
I7r   r   c                       e Zd Zd Zd Zy)PodmanVolumeDefaultsc                 6    || _         || _        di i d| _        y )Nlocal)rI   rB   rL   )r   versiondefaults)r   r   r   s      r   r   zPodmanVolumeDefaults.__init__   s"    %
r   c                     | j                   S r   )rY   r   s    r   default_dictz!PodmanVolumeDefaults.default_dict   s    }}r   N)rO   rP   rQ   r   r[   rS   r   r   rU   rU      s    
r   rU   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	PodmanVolumeDiffc                     || _         || _        d | _        t        |      | _        | j                         | _        i i d| _        i | _        y )N)beforeafter)	r   rX   r[   r
   info
defaultizer   diffnon_idempotent)r   r   ra   r   s       r   r   zPodmanVolumeDiff.__init__   sF    % t$	oo'!B/	 r   c                 R   i }t        | j                  | j                        j                         | _        | j                  j                  D ]X  }| j                  j                  |   !|| j                  v r| j                  |   ||<   =| j                  j                  |   ||<   Z |S r   )rU   r   rX   r[   r   )r   params_with_defaultsps      r   rb   zPodmanVolumeDiff.defaultize  s    !0KK''3|~ 	## 	@A{{!!!$,d6G6G1G*.*;*;A*>$Q'*.++*<*<Q*?$Q'		@
 $#r   c                     ||k7  rA| j                   d   j                  ||i       | j                   d   j                  ||i       yy)Nr_   r`   TF)rc   update)r   
param_namer_   r`   s       r   _diff_update_and_comparez)PodmanVolumeDiff._diff_update_and_compare  sG    U?IIh&&
F';<IIg%%z5&9:r   c                     d| j                   v r| j                   d   ni }| j                  d   }| j                  d||      S )NlabelsrB   ra   r   rk   r   r_   r`   s      r   diffparam_labelz PodmanVolumeDiff.diffparam_label  s@    (0DII(=8$2G$,,WfeDDr   c                 d    | j                   d   }| j                  d   }| j                  d||      S )NrI   rn   ro   s      r   diffparam_driverz!PodmanVolumeDiff.diffparam_driver  s3    8$H%,,XvuEEr   c                    d| j                   v r| j                   d   ni }|j                  dd        |j                  dd        |j                         D cg c]  \  }}dj                  ||f       }}}| j                  d   }t        t        t        |                  t        t        t        |                  }}| j                  d||      S c c}}w )NrL   uidgid=)	ra   poprD   r4   r   sortedlistsetrk   )r   r_   kvr`   s        r   diffparam_optionsz"PodmanVolumeDiff.diffparam_options#  s    )2dii)?9%R

5$

5$/5||~>tq!#((Aq6">>I&  tCK016$s5z:J3K,,YFF% ?s   Cc           	         t        |       D cg c]*  }t        t        | |            r|j                  d      r|, }}t	        | j
                  j                         }d}|D ]  }t        | |      } |       s|r yd} | j                  D ]=  }| j
                  j                  |   | j
                  j                  |   i g dfvs<d}? |S c c}w )N	diffparamFT )	r0   r1   r2   r3   boolr   _diffrd   r   )r   r5   diff_func_list	fail_fast	differentr9   dff_funcrg   s           r   is_differentzPodmanVolumeDiff.is_different=  s    +.t9 ,4%gdD&9:t)@+  , , T[[..//		' 	%ItY/Hz $I	% $$ 	!A{{!!!$0T[[5G5G5JSUWY[]R^5^ 		! !,s   /CN)
rO   rP   rQ   r   rb   rk   rp   rr   r}   r   rS   r   r   r]   r]      s(    !	$E
F
G4r   r]   c                   r     e Zd ZdZ fdZed        Zed        Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Z xZS )PodmanVolumez_Perform volume tasks.

    Manages podman volume, inspects it and checks its current state
    c                     t         t        |           || _        || _        d\  | _        | _        d| _        | j                         | _	        | j                         | _        i | _        g | _        y)zInitialize PodmanVolume class.

        Arguments:
            module {obj} -- ansible module object
            name {str} -- name of volume
        )r   r   N)superr   r   r   r#   stdoutstderrmount_pointget_infora   _get_podman_versionrX   rc   actions)r   r   r#   	__class__s      r   r   zPodmanVolume.__init__W  sa     	lD*,	#) T[MMO	//1	r   c                 2    t        | j                  i k7        S )zCheck if volume exists.)r   ra   r   s    r   existszPodmanVolume.existsi  s     DIIO$$r   c           	      <   t        | j                  | j                  | j                        }|j	                         }|j
                  }| j                  j                  r|r|d   r|d   rdj                  t        |d   j                               D cg c]  \  }}|d| c}}      dz   | j
                  d<   dj                  t        |d   j                               D cg c]  \  }}|d| c}}      dz   | j
                  d<   |S c c}}w c c}}w )zCheck if volume is different.r_   r`   
z - )
r]   r   ra   rX   r   rc   r   r4   rx   rD   )r   	diffcheckr   diffsr{   r|   s         r   r   zPodmanVolume.differentn  s	    %KKIILL	 !--/;;%/eGn"&))06(O))+1- .1a# .#/15#6DIIh "&06'N((*1, -1a# -".04"5DIIg .-s   D
'D
c                    | j                   j                  | j                   j                  d   dd| j                  g      \  }}}|dk(  r<t	        j
                  |      }|r%|d   }|j                  d      | j                  k(  r|S i S )z(Inspect volume and gather info about it.
executables   volumes   inspectr   Name)r   run_commandr   r#   jsonloadsget)r   rcouterrdatas        r   r   zPodmanVolume.get_info  s}     {{..[[-y*diiPRC7::c?DAw88F#tyy0K	r   c                 8   | j                   j                  | j                   j                  d   dg      \  }}}|dk7  s|rd|vr6| j                   j                  d| j                   j                  d   z         |j	                  d      d   j                         S )Nr   s	   --versionr   rX   z%s run failed!r;      )r   r   r   r=   splitstrip)r   r   r   r   s       r   r   z PodmanVolume._get_podman_version  s    {{..[[-|<>C7##!5KK!!&6"&++"4"4\"B'C! Dyy#A&,,..r   c           	      *   t        || j                  j                  | j                  | j                        j	                         }dj                  | j                  j                  d   dg|D cg c]  }t        |       c}z         }t        j                         dk7  r#|dk(  r| j                  j                  d    d| }| j                  j                  d|z         | j                  j                  |       | j                  j                  s}| j                  j                  |d	      \  }}}|| _        || _        |dk7  r.| j                  j!                  d
|d| j"                  ||       |dv r|j%                         | _        yyyc c}w )zPerform action with volume.

        Arguments:
            action {str} -- action to perform - create, delete, mount, unmout
         r   volumer   r   z	 unshare zPODMAN-VOLUME-DEBUG: %sF)expand_user_and_varszCan't z volume )r<   r   r   )r   N)r   r   r   rX   r    r4   r   osgetuidlogr   append
check_moder   r   r   r=   r#   r   r   )r   r   	b_commandr(   full_cmdr   r   r   s           r   _perform_actionzPodmanVolume._perform_action  sq    -V-1[[-?-?-1\\-1[[/ 0M/L/N	 	
 88T[[//=xH5>?y|?@ A 99;!' 1++,,\:;9XJOH1H<=H%{{%%;;22%* 3 ,LBS DKDKQw%%06		Bs & , "#&99;  # & @s   .F
c                 &    | j                  d       y)Delete the volume.r   Nr   r   s    r   r   zPodmanVolume.delete      X&r   c                 &    | j                  d       y)Create the volume.r   Nr   r   s    r   r   zPodmanVolume.create  r   r   c                 &    | j                  d       y)r   r   Nr   r   s    r   r   zPodmanVolume.mount  s    W%r   c                 &    | j                  d       y)r   r   Nr   r   s    r   r   zPodmanVolume.unmount  s    Y'r   c                 D    | j                          | j                          y)zRecreate the volume.N)r   r   r   s    r   recreatezPodmanVolume.recreate  s    r   )rO   rP   rQ   rR   r   propertyr   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r   Q  s^    
$ % %  "//@''&(r   r   c                   N     e Zd ZdZ fdZd
dZd Zd Zd Zd Z	d Z
d	 Z xZS )PodmanVolumeManagerzhModule manager class.

    Defines according to parameters what actions should be applied to volume
    c                    t         t        |           || _        dg i d| _        | j                  j
                  d   | _        | j                  j                  | j                  j
                  d   d      | _        | j                  j
                  d   | _	        | j                  j
                  d   | _
        t        | j                  | j                        | _        y	)
znInitialize PodmanManager class.

        Arguments:
            module {obj} -- ansible module object
        F)changedr   r   r#   r   T)requiredstater   N)r   r   r   r   resultsr   r#   get_bin_pathr   r   r   r   r   )r   r   r   s     r   r   zPodmanVolumeManager.__init__  s     	!413

 KK&&v.	KK$$T[[%7%7%E.2 % 4 	 [[''0
**:6"4;;		:r   c                    |r| j                   j                         n| j                   j                  }| j                   j                  | j                   j                  }}| j
                  j                  ||| j                   j                  d||       | j                   j                  r1| j
                  j                  d| j                   j                  i       | j                  j                  d   r1| j
                  j                  d| j                   j                  i        | j                  j                  di | j
                   y)zInspect the current volume, update results with last info, exit.

        Keyword Arguments:
            changed {bool} -- whether any action was performed
                              (default: {True})
        )r   r   podman_actions)r   r   rc   debugr   NrS   )r   r   ra   r   r   r   ri   r   rc   r   r   rX   	exit_json)r   r   factsr   r   s        r   update_volume_resultz(PodmanVolumeManager.update_volume_result  s     +2$$&t{{7G7G;;%%t{{'9'9S5/3{{/B/BD#&s 	 	4 ;;LL)9)9 :;;;g&LL!14;;3F3F GH--r   c                     | j                   | j                  | j                  | j                  | j                  d}|| j
                     } |        | j                  j                  d       y)z@Execute the desired action according to map of actions & states.presentabsentmounted	unmountedquadletzAUnexpected logic error happened, please contact maintainers ASAP!r;   N)make_presentmake_absent
make_mountmake_unmountmake_quadletr   r   r=   )r   
states_mapprocess_actions      r   executezPodmanVolumeManager.execute  sh     ((&&**((

 $DJJ/ #E 	Fr   c                    | j                   j                  s`| j                   j                          | j                  d   j	                  d| j                   j
                  z         | j                          y| j                  s| j                   j                  r`| j                   j                          | j                  d   j	                  d| j                   j
                  z         | j                          y| j                  d       y)z*Run actions if desired state is 'started'.r   
created %szrecreated %sF)r   N)	r   r   r   r   r   r#   r   r   r   r   s    r   r   z PodmanVolumeManager.make_present	  s    {{!!KK LL#**<$++:J:J+JK%%']]dkk33KK  "LL#**>+/;;+;+;,< =%%'%%e%4r   c                     | j                   j                  s| j                  j                  ddi       n| j                   j                  rl| j                   j	                          | j                  d   j                  d| j                   j                  z         | j                  j                  ddi       | j                  j                  i | j                   j                  d        | j                  j                  di | j                   y)	z)Run actions if desired state is 'absent'.r   Fr   z
deleted %sT)r   r   NrS   )
r   r   r   ri   r   r   r#   r   r   r   r   s    r   r   zPodmanVolumeManager.make_absent  s    {{!!LLE 23[[KK LL#**<$++:J:J+JKLLD 12r/3{{/B/BD 	E--r   c                    | j                   j                  sO| j                   j                          | j                  d   j	                  d| j                   j
                  z         | j                   j                          | j                  d   j	                  d| j                   j
                  z         | j                   j                  r1| j                  j                  d| j                   j                  i       | j                          y)z*Run actions if desired state is 'mounted'.r   r   z
mounted %sr   N)
r   r   r   r   r   r#   r   r   ri   r   r   s    r   r   zPodmanVolumeManager.make_mount#  s    {{!!KK LL#**<$++:J:J+JKY&&|dkk6F6F'FG;;""LL0G0G HI!!#r   c                 B   | j                   j                  r`| j                   j                          | j                  d   j	                  d| j                   j
                  z         | j                          y| j                  j                  d| j
                  z         y)z,Run actions if desired state is 'unmounted'.r   zunmounted %szVolume %s does not exist!r;   N)	r   r   r   r   r   r#   r   r   r=   r   s    r   r   z PodmanVolumeManager.make_unmount.  sp    ;;KK!LL#**>DKK<L<L+LM%%'KK!!&ADII&M!Nr   c                     t        | j                  d      }| j                  j                  |        | j                  j                  di | j                   y )Nr   rS   )r   r   r   ri   r   )r   results_updates     r   r   z PodmanVolumeManager.make_quadlet7  s?    -dkk8DN+--r   )T)rO   rP   rQ   rR   r   r   r   r   r   r   r   r   r   r   s   @r   r   r     s2    
;..$F5
.	$O.r   r   c                     t        t        t        ddg d      t        dd      t        dd      t        dd      t        d	dd
      t        dd      t        ddd      t        dd      t        dd      t        dd      t        dd      t        d	dd
                  } t        |       j                          y )Nstrr   r   )typedefaultchoicesT)r   r   dictFry   )r   elementsr   r   )r   r   podman)r   r   r   pathraw)r   r#   rB   rI   rL   r   r   r   quadlet_dirquadlet_filenamequadlet_file_modequadlet_options)argument_spec)r   r   r   r   )r   s    r   mainr   =  s    E9WY540FU3UU3fuuEvu5IFE2&59!uu="> fuuM
F" '')r   __main__)
__future__r   r   r   r   __metaclass__DOCUMENTATIONRETURNEXAMPLESr   r   ansible.module_utils.basicr   ansible.module_utils._textr   r   Hansible_collections.containers.podman.plugins.module_utils.podman.commonr	   r
   Iansible_collections.containers.podman.plugins.module_utils.podman.quadletr   r   rU   r]   r   r   r   rO   rS   r   r   <module>r      s    A @_B
(4  	 4 : a _ jI IX Q Qhx xvn. n.b** zF r   