
    Vh)                         d dl mZmZmZ eZdZdZ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mZmZ d d
lmZmZ  G d de      Z G d de      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functionu  
module: docker_volume
short_description: Manage Docker volumes
description:
  - Create/remove Docker volumes.
  - Performs largely the same function as the C(docker volume) CLI subcommand.
extends_documentation_fragment:
  - community.docker.docker.api_documentation
  - community.docker.attributes
  - community.docker.attributes.actiongroup_docker

attributes:
  check_mode:
    support: full
  diff_mode:
    support: full
  idempotent:
    support: partial
    details:
      - If O(recreate=always) the module is not idempotent.

options:
  volume_name:
    description:
      - Name of the volume to operate on.
    type: str
    required: true
    aliases:
      - name

  driver:
    description:
      - Specify the type of volume. Docker provides the V(local) driver, but 3rd party drivers can also be used.
    type: str
    default: local

  driver_options:
    description:
      - 'Dictionary of volume settings. Consult the Docker documentation for valid options and values:
        U(https://docs.docker.com/engine/reference/commandline/volume_create/#driver-specific-options).'
    type: dict
    default: {}

  labels:
    description:
      - Dictionary of label key/values to set for the volume.
    type: dict

  recreate:
    description:
      - Controls when a volume will be recreated when O(state=present). Please note that recreating an existing volume will
        cause B(any data in the existing volume to be lost!) The volume will be deleted and a new volume with the same name
        will be created.
      - The value V(always) forces the volume to be always recreated.
      - The value V(never) makes sure the volume will not be recreated.
      - The value V(options-changed) makes sure the volume will be recreated if the volume already exist and the driver, driver
        options or labels differ.
    type: str
    default: never
    choices:
      - always
      - never
      - options-changed

  state:
    description:
      - V(absent) deletes the volume.
      - V(present) creates the volume, if it does not already exist.
    type: str
    default: present
    choices:
      - absent
      - present

author:
  - Alex Grönholm (@agronholm)

requirements:
  - "Docker API >= 1.25"
aQ  
---
- name: Create a volume
  community.docker.docker_volume:
    name: volume_one

- name: Remove a volume
  community.docker.docker_volume:
    name: volume_one
    state: absent

- name: Create a volume with options
  community.docker.docker_volume:
    name: volume_two
    driver_options:
      type: btrfs
      device: /dev/sda2
z
volume:
  description:
    - Volume inspection results for the affected volume.
  returned: success
  type: dict
  sample: {}
N)	to_native)	iteritems)AnsibleDockerClientRequestException)DockerBaseClassDifferenceTrackersanitize_labels)APIErrorDockerExceptionc                        e Zd Z fdZ xZS )TaskParametersc                     t         t        |           || _        d | _        d | _        d | _        d | _        d | _        d | _	        t        |j                  j                        D ]  \  }}t        | ||        y )N)superr   __init__clientvolume_namedriverdriver_optionslabelsrecreatedebugr   moduleparamssetattr)selfr   keyvalue	__class__s       r/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/docker/plugins/modules/docker_volume.pyr   zTaskParameters.__init__   sq    nd,."
#FMM$8$89 	&JCD#u%	&    )__name__
__module____qualname__r   __classcell__)r!   s   @r"   r   r      s    & &r#   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	DockerVolumeManagerc                    || _         t        |      | _        | j                   j                  | _        dg d| _        | j                   j
                  j                  | _        t               | _	        t               | _        | j                         | _        | j                  j                  }|dk(  r| j                          n|dk(  r| j!                          | j                  s"| j                  s| j                  j"                  r]| j                  r7| j                  j%                         \  | j                  d<   | j                  d<   | j                  | j                  d<   y y )NF)changedactionspresentabsentbeforeafterdiff)r   r   
parameters
check_moderesultsr   _diffr1   r   diff_trackerdictdiff_resultget_existing_volumeexisting_volumestater-   r.   r   get_before_after)r   r   r;   s      r"   r   zDockerVolumeManager.__init__   s   (0++00
 KK&&,,	-/6#779%%ILLNhKKM994??+@+@yyHLHYHYHjHjHlE  *D,<,<W,E#'#3#3DLL  ,Ar#   c                    	 | j                   j                  d      }d   y |d   D ]"  }|d   | j
                  j                  k(  s |c S  y # t        $ r.}| j                   j                  t	        |             Y d }~cd }~ww xY w)Nz/volumesVolumesName)r   get_jsonr   failr   r2   r   )r   volumesevolumes       r"   r9   z'DockerVolumeManager.get_existing_volume   s    	+kk**:6G :&j) 	Ff~!<!<<	   	+KKYq\**	+s   A 	B$B  Bc                    t               }| j                  j                  r[| j                  j                  | j                  d   k7  r5|j	                  d| j                  j                  | j                  d          | j                  j
                  r| j                  j                  d      sB|j	                  d| j                  j
                  | j                  j                  d             nt        | j                  j
                        D ]l  \  }}| j                  d   j                  |      r|| j                  d   |   k7  s:|j	                  d|z  || j                  d   j                  |             n | j                  j                  r| j                  j                  d      xs i }| j                  j                  D ]  }|j                  |      | j                  j                  j                  |      k7  s;|j	                  d|z  | j                  j                  j                  |      |j                  |              |S )	z
        Return the list of differences between the current parameters and the existing volume.

        :return: list of options that differ
        Driverr   	parameteractiveOptionsr   zdriver_options.%sLabelsz	labels.%s)	r   r2   r   r:   addr   getr   r   )r   differencesr   r    existing_labelslabels         r"   has_different_configz(DockerVolumeManager.has_different_config   s    ()??!!doo&<&<@T@TU]@^&^OOH0F0FtOcOcdlOmOn??))''++I6 0*.//*H*H'+';';'?'?	'J   L #,DOO,J,J"K YJC 00;??D!T%9%9)%DS%II#(;c(A27/3/C/CI/N/R/RSV/W ( YY ??!!"2266x@FBO// G"&&u-1G1G1K1KE1RROOK%$7.2oo.D.D.H.H.O+:+>+>u+E $ GG r#   c                    | j                   s| j                  s	 | j                  j                  | j                  j                  | j                  j
                  d}| j                  j                  | j                  j                  |d<   | j                  j                  d|      }| j                  j                  d|d         | _         | j                  d   j                  d| j                  j                  d	| j                  j                         d
| j                  d<   y y # t        $ r.}| j                  j                  t        |             Y d }~d }~ww xY w)N)r?   rF   
DriverOptsrK   z/volumes/create)data/volumes/{0}r?   r,   zCreated volume z with driver Tr+   )r:   r3   r2   r   r   r   r   r   post_json_to_jsonr@   r   rA   r   r4   append)r   rT   resprC   s       r"   create_volumez!DockerVolumeManager.create_volume   s)   ##??3 $ ; ;"&//"8"8&*oo&D&DD
 --9)-)?)?X;;889JQU8VD+/;;+?+?PTU[P\+]D( LL#**QUQ`Q`QlQlnrn}n}  oE  oE  ,F  G&*DLL#! $   3KK$$Yq\223s   B2D* *	E!3$EE!c                    | j                   r| j                  s1	 | j                  j                  d| j                  j
                         | j                  d   j                  d| j                  j
                  z         d| j                  d<   y y # t        $ r.}| j                  j                  t        |             Y d }~xd }~ww xY w)NrU   r,   zRemoved volume %sTr+   )r:   r3   r   delete_callr2   r   r   rA   r   r4   rW   )r   rC   s     r"   remove_volumez!DockerVolumeManager.remove_volume   s    ??3KK++NDOO<W<WX LL#**+>A\A\+\]&*DLL#     3KK$$Yq\223s   0B 	C$CCc                    t               }| j                  r| j                         }| j                  j	                  dd| j                  d u       |j
                  s| j                  j                  dk(  s| j                  j                  dk(  r| j                          d | _        | j                          | j                  s"| j                  s| j                  j                  r8|j                         | j                  d<   | j                  j                  |       | j                  s1| j                  j                  s| j                   j#                  d       | j%                         }|| j                   d<   y )	NexistsTrG   options-changedalwaysrN   r,   rD   )r   r:   rQ   r6   rL   emptyr2   r   r\   rY   r1   r3   r   get_legacy_docker_diffsr8   merger4   popr9   )r   rN   volume_factss      r"   r-   zDockerVolumeManager.present  s   ')335Kh$t?S?S[_?_`!!doo&>&>BS&SX\XgXgXpXpt|X| #'D 994??+@+@.9.Q.Q.SD]+##K0t'<'<LLY'//1!-Xr#   c                 x    | j                   j                  dd| j                  d u       | j                          y )Nr^   FrG   )r6   rL   r:   r\   )r   s    r"   r.   zDockerVolumeManager.absent  s5    h%@T@T\`@`ar#   N)
r$   r%   r&   r   r9   rQ   rY   r\   r-   r.    r#   r"   r)   r)      s%    42>+&	+.,r#   r)   c                     t        t        dddg      t        ddddg      t        dd	      t        d
i 	      t        d
      t        ddg d      t        dd	            } t        | d      }t        |j                  j                  d   d|       	 t        |      } |j                  j                  di |j                   y # t        $ rG}|j                  dj                  t        |            t        j                                Y d }~y d }~wt        $ rG}|j                  dj                  t        |            t        j                                Y d }~y d }~ww xY w)NstrTname)typerequiredaliasesr-   r.   )rk   defaultchoiceslocal)rk   rn   r7   )rk   never)r`   rq   r_   boolF)r   r;   r   r   r   r   r   )argument_specsupports_check_moder   z(An unexpected Docker error occurred: {0})	exceptionzSAn unexpected requests error occurred when trying to talk to the Docker daemon: {0}rg   )r7   r   r   r   r   r)   	exit_jsonr4   r   rA   formatr   	traceback
format_excr	   )rs   r   cmrC   s       r"   mainr{     s6   edVHEy9h:OP04 5';ab.M !# F
 FMM((2HfE. (-"**- w>EEiPQlS_h_s_s_uvv .ahhirstiuv**, 	 	. 	..s$   1C 	E)=DE)"=E$$E)__main__)
__future__r   r   r   rk   __metaclass__DOCUMENTATIONEXAMPLESRETURNrx   +ansible.module_utils.common.text.convertersr   ansible.module_utils.sixr   Dansible_collections.community.docker.plugins.module_utils.common_apir   r	   >ansible_collections.community.docker.plugins.module_utils.utilr
   r   r   Eansible_collections.community.docker.plugins.module_utils._api.errorsr   r   r   objectr)   r{   r$   rg   r#   r"   <module>r      s}    A @Ob&
  A . 
&_ & & D.: zF r#   