
    VhW                     l    d Z ddlmZmZmZ eZddlZddlm	Z	 d Z
d Zed        Zed        Zd	 Zd
 Zy)z
The consolidate plugin code
    )absolute_importdivisionprint_functionN)AnsibleFilterErrorc                 &   g }d}t        | j                               D ]V  }| j                  |      sdj                  | j                  |            }|j	                  |j                  ||             X dj                  |      }t        |      )zRaise an error message, prepend with filter name

    Args:
        filter (str): Filter name
        msg (str): Message specific to filter supplied

    Raises:
        AnsibleFilterError: AnsibleError with filter name and message
    z@Error when using plugin 'consolidate': '{filter}' reported {msg}, )filtermsgz; )listkeysgetjoinappendformatr   )errtmp_err	tmplt_errr	   r
   errors         r/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/ansible/utils/plugins/plugin_utils/consolidate.py_raise_errorr      s     GRIsxxz" E776?))CGGFO,CNN9++6s+CDE IIgE
U
##    c                       fd}|S )zDecorator to fail on supplied filters

    Args:
        validator_func (func): Function that generates failure messages

    Returns:
        raw: Value without errors if generated and not failed
    c                       | i |\  }}t        |j                  d      |j                  d      |j                  d      g      rt        |       |S )zFilters return value or raises error as per supplied parameters

        Returns:
            any: Return value to the function call
        fail_missing_match_keyfail_duplicatefail_missing_match_value)anyr   r   )argskwargsresr   validator_funcs       r   
update_errz"fail_on_filter.<locals>.update_err3   s[     "4262S01()23
 
r    )r!   r"   s   ` r   fail_on_filterr$   )   s    " r   c           
         g g g }}}t        | d      D ]  \  }}|d   }g }	t        |d   d      D ]  \  }
}	 |	j                  ||           t	        t        |	            t	        |	      k7  r#|r!|j                  dj                  |             |j                  t        |	              |||d	fS # t        $ r( |r#|j                  dj                  |||
             Y w xY w)
a  Check if the match_key specified is present in all the supplied data,
    also check for duplicate data accross all the data sources

    Args:
        data_sources (list): list of dicts as data sources
        fail_missing_match_key (bool): Fails if match_keys not present in data set
        fail_duplicate (bool): Fails if duplicate data present in a data
    Returns:
        list: list of unique keys based on specified match_keys
       start	match_keydatazNmissing match key '{match_key}' in data source {ds_idx} in list entry {dd_idx})r)   ds_idxdd_idxz(duplicate values in data source {ds_idx})r+   )r   r   )	enumerater   KeyErrorr   sortedset)data_sourcesr   r   resultserrors_match_keyerrors_duplicater+   data_sourcer)   	ds_valuesr,   	data_dicts               r   !check_missing_match_key_duplicater8   G   s    35b"/G(Q? ',		!*;v+>a!H 	FI  9!56	 #i.!VI%66>##:AAAP 	s9~&-'. "2*  !  	)$++hoo&/#)#) p  	s   B44.C%$C%c                    t        t        j                  j                  |             }|s|i fS g }t	        | d      D ]@  \  }}||z
  }|sdj                  |      }|j                  dj                  ||             B |d|ifS )a+  Checks values to match be consistent over all the whole data source

    Args:
        matched_keys (list): list of unique keys based on specified match_keys
        fail_missing_match_value (bool): Fail if match_key value is missing in a data set
    Returns:
        set: set of unique values
    r&   r'   r   z7missing match value {m_matches} in data source {ds_idx})r+   	m_matchesr   )r0   	itertoolschainfrom_iterabler-   r   r   r   )matched_keysr   
all_valueserrors_match_valuesr+   r6   missing_matchr:   s           r   check_missing_match_valuesrB   q   s     Y__22<@AJ#2~&|1= 		"Y.		-0I&&IPP!' Q 		 24GHHHr   c                     i }| D ]X  }|d   }|d   }|d   D ci c]  }||v s||   | }}t        |      D ]#  }||vri ||<   |j                  |i       ||   |<   % Z |S c c}w )zIterate over all the data sources and consolidate the data

    Args:
        data_sources (list): supplied data sources
        all_values (set): a set of keys to iterate over

    Returns:
        list: list of consolidated data
    r)   namer*   )r/   r   )	r1   r?   consolidated_factsr5   r)   sourcedr7   values	            r   consolidate_factsrI      s     # I,	V$.9&.ATYRS^Qy\1_T	TJ' 	IE..,."5)09eR0Hu%f-	I	I  Us
   	A"A"c                 P    t        | ||      }t        ||      }t        | |      }|S )a  Calls data validation and consolidation functions

    Args:
        data_source (list): list of dicts as data sources
        fail_missing_match_key (bool, optional): Fails if match_keys not present in data set. Defaults to False.
        fail_missing_match_value (bool, optional): Fails if matching attribute missing in a data. Defaults to False.
        fail_duplicate (bool, optional): Fails if duplicate data present in a data. Defaults to False.

    Returns:
        list: list of dicts of validated and consolidated data
    )r8   rB   rI   )r1   r   r   r   key_setskey_valsrE   s          r   consolidaterM      s9    $ 1H
 *(4LMH*<Br   )__doc__
__future__r   r   r   type__metaclass__r;   ansible.errorsr   r   r$   r8   rB   rI   rM   r#   r   r   <module>rS      s_    A @   -$(< & &R I I4.r   