
    VhdQ              	       >   d dl mZmZmZ eZd dlZd dlZd dlZd dl	m
Z
mZ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dd
dedgfdd
dd
edgfdddddd
dddiddddZdddZdZdZdZdZ G d  d!e      Z  G d" d#e      Z! G d$ d%e      Z"y)&    )absolute_importdivisionprint_functionN)open_urlConnectionErrorSSLValidationError)env_fallback)URLError	HTTPError)	urlencode)config_ipv6)strip_substr_dict)AnsibleModuleTstrrequiredtypeOME_USERNAMEr   r   fallbackOME_PASSWORDr   r   no_logr   int  r   defaultboolr   path   )hostnameusernamepasswordportvalidate_certsca_pathtimeoutzSessionService/SessionszSessionService/Sessions('{Id}'))SESSION
SESSION_IDzJobService/Jobs({job_id})zJobService/Jobsz%Unable to resolve hostname or IP {0}.z,JobService/Jobs({job_id})/ExecutionHistoriesc                   V    e Zd ZdZd Zed        Zed        Zed        Zed        Z	y)OpenURLResponsezHandles HTTPResponsec                 x    d | _         || _        | j                  r | j                  j                         | _         y y N)bodyrespread)selfr/   s     o/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/dellemc/openmanage/plugins/module_utils/ome.py__init__zOpenURLResponse.__init__D   s.    		99		(DI     c                 r    	 t        j                  | j                        S # t        $ r t        d      w xY w)NzUnable to parse json)jsonloadsr.   
ValueErrorr1   s    r2   	json_datazOpenURLResponse.json_dataJ   s5    	5::dii(( 	5344	5s   ! 6c                 6    | j                   j                         S r-   )r/   getcoder9   s    r2   status_codezOpenURLResponse.status_codeQ   s    yy  ""r4   c                     | j                   dv S )N)            )r=   r9   s    r2   successzOpenURLResponse.successU   s    #777r4   c                 L    | j                   j                  j                  d      S )NX-Auth-Token)r/   headersgetr9   s    r2   token_headerzOpenURLResponse.token_headerY   s    yy  $$^44r4   N)
__name__
__module____qualname____doc__r3   propertyr:   r=   rC   rH    r4   r2   r+   r+   A   sZ    ) 5 5 # # 8 8 5 5r4   r+   c                       e Zd ZdZddZd ZddZddZddZddZ		 	 dd	Z
d
 Zd Zd Zd Zd ZddZd Zd ZddZddZ	 ddZ	 ddZd Zd Zd Zy) RestOMEzHandles OME API requestsNc                 X   || _         t        | j                   d         j                  d      | _        | j                   d   | _        | j                   d   | _        | j                   j                  d      | _        | j                   d   | _        | j                   j                  dd      | _	        | j                   j                  d	      | _
        | j                   j                  d
d      | _        || _        d | _        d| _        ddd| _        t!        | j                        | _        y )Nr!   z][r"   r#   x_auth_tokenr$   r%   Tr&   r'   r    httpszapplication/json)zContent-TypeAccept)module_paramsr   stripr!   r"   r#   rG   rR   r$   r%   r&   r'   req_session
session_idprotocol_headersr   )r1   rU   rW   s      r2   r3   zRestOME.__init__a   s    *D..z:;AA$G**:6**:6 ..22>B&&v.	"00445EtL))--i8))--i<&);GYZ#DMM2r4   c                 d    dj                  | j                  | j                  | j                        S )zbuilds base urlz{0}://{1}:{2}/api)formatrY   r!   r$   r9   s    r2   _get_base_urlzRestOME._get_base_urlq   s#    "))$--		RRr4   c                     |}| j                         }|rdj                  ||      }|r.	 |dj                  t        |      j                  dd            z  }|S )zbuilds complete urlz{0}/{1}z?{0}+z%20)r]   r\   r   replace)r1   r   query_paramurlbase_uris        r2   
_build_urlzRestOME._build_urlu   s]    %%'""8T2CJ6==;!7!?!?U!KLLC
r4   c                     | j                   }|r|j                  |       || j                  }| j                  | j	                         | _        || j
                  | j                  d||dd}|S )zCreates an argument common specTall)methodr%   r&   	use_proxyrF   r'   follow_redirects)rZ   updater'   r&   _get_omam_ca_envr%   r1   rg   api_timeoutrF   
req_header
url_kwargss         r2   _url_common_args_speczRestOME._url_common_args_spec   ss    ]]
g&,,K<<002DL"11||!" %

 r4   c                     | j                   }|r|j                  |       | j                  |||      }| j                  |d<   | j                  |d<   d|d<   |S )z8Creates an argument spec in case of basic authenticationrF   url_usernameurl_passwordTforce_basic_auth)rZ   rj   rp   r"   r#   rl   s         r2   _args_without_sessionzRestOME._args_without_session   s`    ]]
g&//W/U
%)]]
>"%)]]
>")-
%&r4   c                 8    | j                  |||      }d|d<   |S )z@Creates an argument spec, in case of authentication with sessionrr   Fru   )rp   )r1   rg   rm   rF   ro   s        r2   _args_with_sessionzRestOME._args_with_session   s*    //W/U
).
%&r4   c                 F   	 d| j                   v r| j                  |||      }n| j                  |||      }|r|rt        j                  |      }| j                  ||      }	t        |	fd|i|}
t        |
      }|S # t        t        t        t        f$ r}|d}~ww xY w)a  
        Sends a request through open_url
        Returns :class:`OpenURLResponse` object.
        :arg method: HTTP verb to use for the request
        :arg path: path to request without query parameter
        :arg data: (optional) Payload to send with the request
        :arg query_param: (optional) Dictionary of query parameter to send with request
        :arg headers: (optional) Dictionary of HTTP Headers to send with the
            request
        :arg api_timeout: (optional) How long to wait for the server to send
            data before giving up
        :arg dump: (Optional) boolean value for dumping payload data.
        :returns: OpenURLResponse
        rE   rr   ra   dataN)rZ   rx   rv   r6   dumpsrd   r   r+   r   r
   r   r   )r1   rg   r   r{   ra   rF   rm   dumpro   rb   r/   	resp_dataerrs                r2   invoke_requestzRestOME.invoke_request   s     	.!44V[RY4Z
!77U\7]
zz$'//$K/@CC9d9j9D'-I  8%7I 	I	s   A<B   B BB c                    | j                   r| j                  s| j                  | j                  dd}t        d   }| j                  d||      }|rG|j                  r;|j                  j                  d      | _	        |j                  | j                  d<   | S d}t        |      | j                  | j                  | j                  d<   | S )	z(Creates sessions by passing it to headerAPI)UserNamePasswordSessionTyper(   POSTr{   IdrE   zCould not create the session)rW   rR   r"   r#   SESSION_RESOURCE_COLLECTIONr   rC   r:   rG   rX   rH   rZ   r   )r1   payloadr   r/   msgs        r2   	__enter__zRestOME.__enter__   s    D$5$5#'==#'==&+/G /y9D&&vt'&BD"&.."4"4T":040A0An- 	 5%c***,0,=,=DMM.)r4   c                     | j                   r5t        d   j                  | j                         }| j                  d|       y)z1Deletes a session id, which is in use for requestr)   )r   DELETEF)rX   r   r\   r   )r1   exc_type	exc_value	tracebackr   s        r2   __exit__zRestOME.__exit__   s8    ??.|<CCtCWD$/r4   c                    	 | j                  d|      }|j                  }|d   }|d   }|t        |      z
  }t        |      }|dkD  rV| j                  d||t        |      d      }|j                  }|d   }|j                  |       |t        |      z
  }|dkD  rV||dS # t        t
        t        t        t        t        f$ r}	|	d}	~	ww xY w)	z
        This implementation mainly dependent on '@odata.count' value.
        Currently first request without query string, always returns total number of available
        reports in '@odata.count'.
        GETvalue@odata.countr   )z$topz$skiprz   )resp_objreport_listN)
r   r:   lenextendr
   r   r   r   	TypeErrorr8   )
r1   urir/   r{   r   total_countremaining_countfirst_page_countr   r   s
             r2   get_all_report_detailszRestOME.get_all_report_details   s    	&&uc2D>>Dw-K~.K)C,<<O";/!A%**5#@P[^_j[k7l + n~~W""5)"1CJ"> "A% !%[AA)%7)U_` 	I	s   BB# B# ##CCCc                 z    d}| j                  dd      }|j                  d   }|D ]  }|d   |k(  s|d   } |S  |S )z$This provides an ID of the job type.Nr   zJobService/JobTypesr   Namer   )r   r:   )r1   jobtype_namejob_type_idr/   r{   eachs         r2   get_job_type_idzRestOME.get_job_type_id   s]    ""5*?@~~g& 	DF||+"4j		 r4   c                     d}dj                  |      }| j                  ddd|i      }|j                  j                  dg       }i }|r
|d   }|d	   }||d
S )z
        :param service_tag: service tag of the device
        :return: dict
        Id: int: device id
        value: dict: device id details
        not_found_msg: str: message if service tag not found
        NzDeviceServiceTag eq '{0}'r   zDeviceService/Devices$filterrz   r   r   r   )r   r   )r\   r   r:   rG   )r1   service_tag	device_idqueryresponser   device_infos          r2   get_device_id_from_service_tagz&RestOME.get_device_id_from_service_tag   sv     	+22;?&&u.ET]_dSe&f""&&w3(K#D)I+66r4   c                    	 | j                  d||      }|j                  }|j                  dg       }|j                  dd      }|j                  dd      }|r[| j                  d|j                  d      d	         }|j                  }|d   }|j                  dd      }|j	                  |       |r[||d
S # t
        t        t        t        t        t        f$ r}	|	d}	~	ww xY w)z
         This implementation mainly to get all available items from ome for pagination
         supported GET uri
        :param uri: uri which supports pagination
        :return: dict.
        r   rz   r   r   r   z@odata.nextLink z/api)r   r   N)r   r:   rG   splitr   r
   r   r   r   r   r8   )
r1   r   ra   r/   r{   total_itemsr   	next_linkr   r   s
             r2   get_all_items_with_paginationz%RestOME.get_all_items_with_pagination  s    	&&uc{&KD>>D((7B/K((>15K!2B7I**5)//&2I"2MN~~W HH%6;	""5)  $/EE)%7)U_` 	I	s   B2B: 5B: :#C$CC$c                     i }| j                  dd      }|j                  j                  d      r.t        |j                  d   D cg c]  }|d   |d   f c}      }|S c c}w )z
        Returns device type map where as key is type and value is type name
        eg: {1000: "SERVER", 2000: "CHASSIS", 4000: "NETWORK_IOM", "8000": "STORAGE_IOM", 3000: "STORAGE"}
        :return: dict, first item dict gives device type map
        r   zDeviceService/DeviceTyper   
DeviceTyper   )r   r:   rG   dict)r1   
device_mapr   items       r2   get_device_typezRestOME.get_device_type)  sk     
&&u.HI!!'*hN`N`ahNijd\ 2DLAjkJ ks   A c                 z   	 ddddddddd	d
ddd}g d}t         j                  |      }| j                  d|      }|j                  }|d   d   }|dv rd}dj                  ||         }	d}
|
||	fS ||v rd}
d}dj                  ||         }	|
||	fS y# t        $ r d}dj                  |      }	d}
|
||	fcY S w xY w)N	ScheduledQueuedStartingRunning	CompletedFailedWarningNewAbortedPausedStoppedCanceled)  i  i  i      *  i   4  5  6  7  )r   r   r   r   r   r   job_idr   LastRunStatusr   )r   r   FzJob {0} successfully.Tz*Job is in {0} state, and is not completed.)FFNz&Unable to track the job status of {0}.)JOB_URIr\   r   r:   r   )r1   r   job_status_mapfailed_job_statusjob_urljob_respjob_dict
job_status
job_failedmessage	exit_polls              r2   get_job_infozRestOME.get_job_info5  s   	2!9\giuIU]en N
 !EnnFn3G**5':H))H!/248J\)"
188
9ST 	 *g5500 	!
FMMn]gNhi *g55% 	2J>EEfMGIj'11		2s   A/B 2 B #B:9B:c                     |}|}|rD||kD  r||z
  }n|}d}t        j                  |       | j                  |      \  }}}|du r||fS |rDddj                  |      fS )z
        job_id: job id
        job_wait_sec: Maximum time to wait to fetch the final job details in seconds
        sleep_time: Maximum time to sleep in seconds in each job details fetch
        r   Tz*The job is not complete after {0} seconds.)timesleepr   r\   )	r1   r   job_wait_sec
sleep_timemax_sleep_timesleep_intervalr   r   job_messages	            r2   job_trackingzRestOME.job_trackingR  s     &#.!/.!@!/!"JJ~&151B1B61J.Iz;D !;..  AHHVVVr4   c                     |j                         }|j                         }|D ]/  }|t        |      j                         v s|j	                  |       1 |S r-   )copykeysr   lowerpop)r1   
odata_dictchkstrcpklistks         r2   r   zRestOME.strip_substr_dictf  sN    __	 	"AQ'q!	" r4   c                 J    |||||||d}| j                  dt        |      }	|	S )N)JobNameJobDescriptionScheduleStateTargetsParamsJobTyper   r   )r   JOB_SERVICE_URI)
r1   job_namejob_desctargetsparamsjob_typeschedulestatejob_payloadr   s
             r2   job_submissionzRestOME.job_submissionn  s8    "*h#+e!'H> &&v[&Qr4   c                     ddd}dddd|dd|dd	|dd
ddg}||j                  d|d       ||j                  d|d       ||j                  d|d       | j                  ddg ||      }	|	S )N8   ValidateNWFileShare_Task)r   r   checkPathOnlyfalse)KeyValue	shareTypeShareNetworkFilePathshareAddresstestShareWriteAccesstruer   r   
domainNamezValidate Share)appendr  )
r1   share_address
share_path
share_type
share_usershare_passwordshare_domainr   r   job_responses
             r2   test_network_connectionzRestOME.test_network_connectionv  s    &@A#g6*5*Z@"];*V<
 !MM*zBC%MM*~FG#MM,FG**+;=MrSY[cdr4   c                     ddi}| j                  dt        |      }|j                  j                  d      |j                  d   ng }|D ]  }|d   d   |k(  sd}|} ||fS  d	}|}||fS )
Nr   zPLastRunStatus/Id eq 2030 or LastRunStatus/Id eq 2040 or LastRunStatus/Id eq 2050r   rz   r   r   r   FT)r   r   r:   rG   )r1   job_type_namera   r   job_lstjobjob_allowedavailable_jobss           r2   check_existing_job_statez RestOME.check_existing_job_state  s     "tu&&uo;&W191C1C1G1G1P1\($$W-bd 	%C9~f%6#!$ N**	% K$NN**r4   c                     t         j                  j                  d      xs@ t         j                  j                  d      xs t         j                  j                  d      S )zcCheck if the value is set in REQUESTS_CA_BUNDLE or CURL_CA_BUNDLE or OMAM_CA_BUNDLE or returns NoneREQUESTS_CA_BUNDLECURL_CA_BUNDLEOMAM_CA_BUNDLE)osenvironrG   r9   s    r2   rk   zRestOME._get_omam_ca_env  sA    zz~~23{rzz~~FV7W{[][e[e[i[ijz[{{r4   c                 ,   	 g }| j                  dt        j                  |            }|j                  j	                  d      }t        d |D              }t        |j                               }t        j                  |      dj                  ||d            z   }| j                  |      }|j	                  d      D ]@  }	t        |	      }	|	j	                  di       j                  dd        |j                  |	       B 	 |S # t        $ r Y S w xY w)	Nr   r   r   c              3   0   K   | ]  }|d    |d   f  yw)	StartTimer   NrN   ).0xs     r2   	<genexpr>z4RestOME.get_job_execution_details.<locals>.<genexpr>  s     G!Q{^QtW5Gs   z({0})/ExecutionHistoryDetailsr   	JobStatusz@odata.type)r   JOB_EXEC_HISTORYr\   r:   rG   r   sortedr   r   r   r   r  	Exception)
r1   r   job_detail_statusr/   ex_histtmp_dictsorted_datesex_urlall_execjb_ips
             r2   get_job_execution_detailsz!RestOME.get_job_execution_details  s   	 "&&u.>.E.EV.E.TUDnn((1GGwGGH!(--/2L%,,F,;>]>d>demnz{}n~e  ?A  AF99&AH!g. 0)%0		+r*..}dC!((/0 !   	  	s   DD 	DD)NFr-   )NNNNT)iX  <   )z@odata.)startnowEnabled)NNN)rI   rJ   rK   rL   r3   r]   rd   rp   rv   rx   r   r   r   r   r   r   r   r   r   r   r   r  r  r   rk   r8  rN   r4   r2   rP   rP   ^   s    "3 S
(	 QU.2<$0	7$.
2:W( 3< TX&+|!r4   rP   c                   (     e Zd Z	 	 	 	 d fd	Z xZS )OmeAnsibleModulec                 j   dddddt         dgfddddt         dgfddddt         d	gfdd
dddddddid
ddd}|j                  |       ddg}dg}dg}|g }|j                  |       |g }|j                  |       |g }|j                  |       |
i }
t        |   |||||||||	|

       y )NTr   r   Fr   r   r   r   OME_X_AUTH_TOKENr   r   r   r   r   r   r    )r!   r"   r#   rR   r$   r%   r&   r'   )r"   rR   )r#   rR   )r"   r#   )r	   rj   r   superr3   )r1   argument_specbypass_checksr   mutually_exclusiverequired_togetherrequired_one_ofadd_file_common_argssupports_check_moderequired_ifrequired_byome_argument_specauth_mutually_exclusiveauth_required_one_ofauth_required_together	__class__s                  r2   r3   zOmeAnsibleModule.__init__  s(   
 &*59%*EWeVfGgh%*ETXdgufvWwx).\hk}j~[  A"s3'-$?' %"5	
 	./#?A]"^ <=":!;%!#!!"9:$ "  !78" O34Kv+->(*>,k;	Hr4   )	FFNNNFFNN)rI   rJ   rK   r3   __classcell__)rN  s   @r2   r=  r=    s    BG<@<AJN#H #Hr4   r=  )#
__future__r   r   r   r   __metaclass__r6   r%  r   ansible.module_utils.urlsr   r   r   &ansible.module_utils.common.parametersr	   +ansible.module_utils.six.moves.urllib.errorr
   r   +ansible.module_utils.six.moves.urllib.parser   Aansible_collections.dellemc.openmanage.plugins.module_utils.utilsr   r   ansible.module_utils.basicr   ome_auth_paramsr   r   r   HOST_UNRESOLVED_MSGr.  objectr+   rP   r=  rN   r4   r2   <module>r[     s   : C B  	  S S ? K A Y _ 4 "51!5|nM]>^_!5D|^l]mNnos+%$7"- )3 
 &#= A 5f 5:M!f M!`
$H} $Hr4   