
    Vh+T                     |   d Z ddlmZmZmZ eZdZdZddl	Z	ddl
mZmZ ddlmZmZmZmZmZmZmZmZmZ dZ	 dd	lmZ d
Zed        Zed        Zed        Zed        Zed        Zed        Z ed        Z!edd       Z"ed        Z#ed        Z$d Z%d Z&d Z'd Z(d Z)d Z*e+dk(  r e*        yy# e$ r d
ZY |w xY w)z?This module creates, deletes or modifies metadata on Infinibox.    )absolute_importdivisionprint_functiona  
---
module: infini_metadata
version_added: 2.13.0
short_description:  Create, Delete or Modify metadata on Infinibox
description:
    - This module creates, deletes or modifies metadata on Infinibox.
    - Deleting metadata by object, without specifying a key, is not implemented for any object_type (e.g. DELETE api/rest/metadata/system).
    - This would delete all metadata belonging to the object. Instead delete each key explicitely using its key name.
author: David Ohlemacher (@ohlemacher)
options:
  object_type:
    description:
      - Type of object
    type: str
    required: true
    choices: ["cluster", "fs", "fs-snap", "host", "pool", "system", "vol", "vol-snap"]
  object_name:
    description:
      - Name of the object. Not used if object_type is system
    type: str
    required: false
  key:
    description:
      - Name of the metadata key
    type: str
    required: true
  value:
    description:
      - Value of the metadata key
    type: str
    required: false
  state:
    description:
      - Creates/Modifies metadata when present or removes when absent.
    type: str
    required: false
    default: present
    choices: [ "stat", "present", "absent" ]

extends_documentation_fragment:
    - infinibox
a  
- name: Create new metadata key foo with value bar
  infini_metadata:
    name: foo
    key: bar
    state: present
    user: admin
    password: secret
    system: ibox001
- name: Stat metadata key named foo
  infini_metadata:
    name: foo
    state: stat
    user: admin
    password: secret
    system: ibox001
- name: Remove metadata keyn named foo
  infini_vol:
    name: foo_snap
    state: absent
    user: admin
    password: secret
    system: ibox001
N)AnsibleModulemissing_required_lib)	HAS_INFINISDKapi_wrapperget_clusterget_filesystemget_hostget_pool
get_system
get_volumeinfinibox_argument_specT)APICommandFailedFc           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z Get metadata about a volume object_typeobject_namekeyN	metadata//pathCannot find z metadata key. Volume  key 
 not foundzVolume with object name % not found. Cannot stat its metadata.msgr   paramsr   idapigetr   	fail_json)
moduledisable_failsystemr   r   r   metadatavolr   r   s
             w/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/infinidat/infinibox/plugins/modules/infini_metadata.pyget_metadata_volr,   o   s     F--.K--.K
--
CH
VV
$C
366(!C5)	zz~~4~0H O	 (5Z[S!O   	  ";- 0)]%uJ@ O	   B &C ?C c           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z Get metadata about a fs r   r   r   Nr   r   r   r   z metadata key. File system r   r   zFile system named r   r   r   r!   r   r"   r#   r$   r   r%   )
r&   r'   r(   r   r   r   r)   fsr   r   s
             r+   get_metadata_fsr1      s     F--.K--.K
--
CH		'B	255'3%(	zz~~4~0H O	 ";-/TUS!O   	  ";- 0##.-uSEE O	r-   c           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z Get metadata about a host r   r   r   Nr   r   r   r   z metadata key. Host r   r   zHost named r   r   )r   r!   r   r"   r#   r$   r   r%   )
r&   r'   r(   r   r   r   r)   hostr   r   s
             r+   get_metadata_hostr4           F--.K--.K
--
CHFF#D477)1SE*	zz~~4~0H O	 K=(MNS!O   	  ";- 0'=cU*> O	r-   c           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z Get metadata about a cluster r   r   r   Nr   r   r   r   z metadata key. Cluster r   r   zCluster named r   r   )r   r!   r
   r"   r#   r$   r   r%   )
r&   r'   r(   r   r   r   r)   clusterr   r   s
             r+   get_metadata_clusterr8      s     F--.K--.K
--
CH&&)G7::,au-	zz~~4~0H O	 {m+PQS!O   	  ";- 0*m5ZA O	r-   c           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z" Get metadata about a fs snapshot r   r   r   Nr   r   r   r   z$ metadata key. File system snapshot r   r   zFile system snapshot named r   r   r/   )
r&   r'   r(   r   r   r   r)   fssnapr   r   s
             r+   get_metadata_fssnapr;      s     F--.K--.K
--
CHFF+F699+Qse,	zz~~4~0H O	 +K=8]^S!O   	  ";- 0,,7=cU*N O	r-   c           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z Get metadata about a pool r   r   r   Nr   r   r   r   z metadata key. Pool r   r   zPool named r   r   )r   r!   r   r"   r#   r$   r   r%   )
r&   r'   r(   r   r   r   r)   poolr   r   s
             r+   get_metadata_poolr>      r5   r-   c           
         t        |       }| j                  d   }| j                  d   }| j                  d   }d}t        | |      }|r1d|j                   d| }	 |j                  j                  |      }|S |sd| d}	| j                  |	       |S # t        $ r! |s| j                  d| d	| d
| d       Y |S w xY w)z$ Get metadata for a volume snapshot r   r   r   Nr   r   r   r   z metadata key. Volume snapshot r   r   zVolume snapshot named r   r   r    )
r&   r'   r(   r   r   r   r)   volsnapr   r   s
             r+   get_metadata_volsnaprA     s     F--.K--.K
--
CH(G7::,au-	zz~~4~0H O	 &{m3XYS!O   	  ";- 0''2m5ZI O	r-   c                    t        |       }| j                  d   }| j                  d   }| j                  d   }|dk(  r%d| d| }|j                  j                  |      }n|dk(  rt	        | |      }n|d	k(  rt        | |      }nr|d
k(  rt        | |      }n`|dk(  rt        | |      }nN|dk(  rt	        | |      }n<|dk(  rt        | |      }n*|dk(  rt        | |      }nd| d}| j                  |       r1|j                         }	|s|	sd| d| d}| j                  |       |	S |ryd| d| d}| j                  |       y)z
    Find and return metadata
    Use disable_fail when we are looking for metadata
    and it may or may not exist and neither case is an error.
    r   r   r   r(   r   z?key=r   r0   r*   r3   r7   fs-snapr=   vol-snapzMetadata for z not supported. Cannot stat.r   z
 with key z not found. Cannot stat.Nz named )r   r!   r#   r$   r1   r,   r4   r8   r>   rA   r%   
get_result)
r&   r'   r(   r   r   r   r   r)   r   results
             r+   get_metadatarG   ,  s    F--.K--.K
--
Ch;-uSE2::>>t>,		"6<8		#FL9		$V\:			!'=			!"6<8		$V\:	
	"'= k]*FGS!$$&F!+j=UVC%+gk]:R
SC
    c                    t        |       }| j                  d   }| j                  d   }| j                  d   }|dk(  rd}n|dk(  rIt        | |      }|s*| j                  d   }d| d	| d
}| j                  |       d|j                   }n|dk(  rIt        | |      }	|	s*| j                  d   }d| d	| d
}| j                  |       d|	j                   }n|dk(  rIt        | |      }
|
s*| j                  d   }d| d	| d
}| j                  |       d|
j                   }n3|dk(  rHt        | |      }|s*| j                  d   }d| d	| d
}| j                  |       d|j                   }n|dk(  rHt        | |      }|s*| j                  d   }d| d	| d
}| j                  |       d|j                   }n|dk(  rHt        | |      }|s*| j                  d   }d| d	| d
}| j                  |       d|j                   }nL|dk(  rGt        | |      }|s*| j                  d   }d| d	| d
}| j                  |       d|j                   }||i}|j                  j                  |       y)zKCreate metadata key with a value.  The changed variable is found elsewhere.r   r   valuer(   zmetadata/systemr*   r   zVolume z$ not found. Cannot add metadata key .r   r   r0   zFile system r3   zCluster r7   rC   zFile system snapshot r=   zPool rD   zVolume snapshot )r   dataN)r   r!   r   r%   r"   r   r   r
   r   r#   put)r&   r(   r   r   rJ   r   r*   r   r   r0   r3   r7   r:   r=   r@   rL   s                   r+   put_metadatarN   ]  s    F--.K
--
CMM'"E h 		( --6KK=(LSEQRSC%366(#		FF+ --6K -QRUQVVWXC%255'"		' --6K[M)McURSTC%477)$			!ff- --6K[M)McURSTC%7::,'			!/ --6K)+6Z[^Z__`aC%699+&		' --6K+&J3%qQC%477)$	
	"VV, --6K$[M1UVYUZZ[\C%7::,' 	UD
 JJNN4N(rH   c                 x   t        |       }d}| j                  d   }| j                  d   }|dk(  rd| }n<|dk(  r&t        | |      }|sd}|S d|j                   d| }n|d	k(  r%t	        | |      }|sd}|S d|j                   d| }n|d
k(  r%t        | |      }|sd}|S d|j                   d| }n|dk(  r%t        | |      }	|	sd}|S d|	j                   d| }n|dk(  r%t	        | |      }
|
sd}|S d|
j                   d| }ni|dk(  r%t        | |      }|sd}|S d|j                   d| }n?|dk(  r%t        | |      }|sd}|S d|j                   d| }n| j                  d| d       	 |j                  j                         d}|S # t        $ r}|j                  dk7  r Y d}~|S d}~ww xY w)z
    Remove metadata key.
    Not implemented by design: Deleting all of the system's metadata
    using 'DELETE api/rest/metadata/system'.
    Fr   r   r(   zmetadata/system/r*   r   r   r0   r3   r7   rC   r=   rD   zObject type z not supportedr   Ti  N)r   r!   r   r"   r   r   r
   r   r%   r#   deleter   status_code)r&   r(   changedr   r   r   r*   r0   r3   r7   r:   r=   r@   errs                 r+   delete_metadatarT     s,    FG--.K
--
Ch!#'		(GN366(!C5)		FF+GN255'3%(		'GN477)1SE*			!ff-GN7::,au-			!/GN699+Qse,		'GN477)1SE*	
	"VV,GN7::,au-<}NCD

t$ N  ??c! "Ns   5F 	F9F44F9c                     | j                   d   }| j                   d   }t        |       }|dk(  r|d   d   }|d   d   }|d   d   }n|d   }|d   }|d   }dd	|||||d
} | j                  di | y)zReturn metadata statr   r   r(   r   r"   	object_idrJ   zMetadata foundF)r   rR   r   r   r"   rV   rJ   N )r!   rG   	exit_json)r&   r   r   r)   metadata_idrV   rJ   rF   s           r+   handle_statrZ     s    --.K
--
CF#Hhqk$'QK,	G$tn[)	!  "F FvrH   c                     d}d}| j                   s/t        | d      }t        |        t        |       }||k7  }|rd}nd}| j                  ||       y)	zMake metadata presentFMetadata unchangedT)r'   zMetadata changedzGMetadata unchanged since the value is the same as the existing metadatarR   r   N)
check_moderG   rN   rX   )r&   rR   r   old_metadatanew_metadatas        r+   handle_presentra     s]    G
C#F>V#F+,.$C[C
W#.rH   c                 n    d}d}| j                   st        |       }|rd}nd}| j                  ||       y)zMake metadata absentr\   FzMetadata removedz2Metadata did not exist so no removal was necessaryr]   N)r^   rT   rX   )r&   r   rR   s      r+   handle_absentrc     s?    
CG!&)$CFC
W#.rH   c                 *   | j                   d   }	 |dk(  rt        |        n7|dk(  rt        |        n&|dk(  rt        |        n| j	                  d|        t        |       }|j                          y# t        |       }|j                          w xY w)z3Determine which state function to execute and do sostatestatpresentabsentz'Internal handler error. Invalid state: r   N)r!   rZ   ra   rc   r%   r   logout)r&   re   r(   s      r+   execute_staterj      s    MM'"EF?i6"h&!#J5'!RSF# F#s   AA5 5Bc                 6   | j                   d   }| j                   d   }| j                   d   }g d}||vr| j                  d| d|        |dk(  r|r)| j                  d       n|s| j                  d	| d
       | j                   d   }|s| j                  d| d       |dk(  ry!|dk(  r| j                   d   }| j                   d   }|s| j                  d| d| d       |dk(  r|dk(  r&ddg}||vr| j                  d| d| d| d| d	       |dv r1	 t        j                  |j	                               | j                   d<   |dv r2	 t        j                  |j	                               | j                   d<   y!y!y!|dk(  ry!| j                  d| d        y!# t        j
                  j                  $ r | j                  d| d| d| d       Y w xY w# t        j
                  j                  $ r | j                  d| d| d| d       Y y!w xY w)"zVerify module options are sanere   r   r   r7   r0   rC   r3   r=   r(   r*   rD   zCannot create z& metadata. Object type must be one of r(   z;An object_name for object_type system must not be provided.zThe name of the z! must be provided as object_name.r   zCannot create a z* metadata key without providing a key namerf   rg   rJ   z metadata key z without providing a valuezui-dataset-default-provisioningTHICKTHINz metadata for key z. Value must be one of z. Invalid value: rK   )zui-dataset-base2-unitszui-feedback-dialogzui-feedback-formz@. Value must be able to be decoded as a boolean. Invalid value: )zui-bulk-volume-zero-paddingzui-table-export-limitz0. Value must be of type integer. Invalid value: rh   zInvalid state 'z
' providedN)r!   r%   jsonloadslowerdecoderJSONDecodeError)r&   re   r   r   object_typesr   rJ   valuess           r+   check_optionsrv   1  s   MM'"E--.K--.K	L ,&[M)OP\~^	

 hZ[";-/PQ --
C+K=8bcd	)	mmE"g&";-~cUB\] ("77!6*&$$(5Gu M006x7HqR   
-1ZZ-FFMM'*   -1ZZ-FFMM'*1 #H 
(	?5'<=- ||33 $$(5Gu MYY^X__`b ||33 $$(5Gu MIINqRs$   0F 0G 8GG8HHc            	          t               } | j                  dg ddddddddddddg d	d
d       t        | d      }t        s|j	                  t        d             t        |       t        |       y)z Main Trl   )requiredchoicesFN)rx   default)rx   no_logrg   )rf   rg   rh   )rz   ry   )r   r   r   rJ   re   )supports_check_mode	infinisdkr   )r   updater   r   r%   r   rv   rj   )argument_specr&   s     r+   mainr     s    +-M(,  :C  D(-$? $6"'D9!*7TU	
 =dCF1+>?&&rH   __main__)F),__doc__
__future__r   r   r   type__metaclass__DOCUMENTATIONEXAMPLESro   ansible.module_utils.basicr   r   Fansible_collections.infinidat.infinibox.plugins.module_utils.infiniboxr   r	   r
   r   r   r   r   r   r   infinisdk.core.exceptionsr   ImportErrorHAS_CAPACITYr,   r1   r4   r8   r;   r>   rA   rG   rN   rT   rZ   ra   rc   rj   rv   r   __name__rW   rH   r+   <module>r      sm   F
 A @*X6  J
 
 
 :   4  4  4  4  4  4  4 - -` D) D)P ? ?D4/ 
/"V>r. zF q  Ms   B1 1B;:B;