
    mj                     r   d dl Z d dlmZmZ d dlmZ d dlmZ ddlmZm	Z	m
Z
mZ ddlmZ ded	efd
Zded	efdZ edd       G d d             Z edd       G d d             Z edd       G d d             Z edd       G d d             Z edd       G d d             Z edd       G d d             Z edd       G d d             Z edd       G d d             Z edd       G d d              Z edd       G d! d"             Z edd       G d# d$             Zy)%    N)	dataclassfield)datetime)Any   )HealthStatusObservationStatusOperationalStateSeverity)ensure_aware_utcjob_keyreturnc                 ~    | j                  d      }t        |      dk  st        d |D              rt        d      | S )N.   c              3   r   K   | ]/  }| xs& |j                          xs ||j                         k7   1 y wN)isalnumlower).0parts     J/opt/struktur/hermes-workspace/worker-watcher/src/worker_watcher/models.py	<genexpr>z#validate_job_key.<locals>.<genexpr>   s4     fX\XST\\^);Sttzz|?SSfs   57z?job_key must be lowercase dot-separated alphanumeric components)splitlenany
ValueError)r   partss     r   validate_job_keyr   
   s:    MM#E
5zA~f`effZ[[N    	agent_keyc                 H    t        j                  d|       st        d      | S )Nz[a-z0-9][a-z0-9._-]{1,127}z/agent_key must be a stable lowercase identifier)re	fullmatchr   )r!   s    r   validate_agent_keyr%      s#    <<5yAJKKr    T)frozenslotsc                       e Zd ZU eed<   eed<   eed<   eed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed	<   d
Z
eed<    ee      Zeeef   ed<   ddZy)JobDescriptorr   namesource_typejob_typeNdescriptionexpected_interval_secondstimeout_secondsstale_after_secondsTenableddefault_factorymetadatac                     t        | j                         | j                  | j                  | j                  fD ]  }||dk  st        d       y )Nr   z,interval and timeout values must be positive)r   r   r.   r/   r0   r   selfvalues     r   __post_init__zJobDescriptor.__post_init__$   sP    &44d6J6JDLdLde 	QE UaZ !OPP	Qr    r   N)__name__
__module____qualname__str__annotations__r-   r.   intr/   r0   r1   boolr   dictr4   r   r9    r    r   r)   r)      sx    L
IM"Kt",0sTz0"&OS4Z&&*t*GT$T:Hd38n:Qr    r)   c                      e Zd ZU eed<   eed<   eed<   eed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed	<   dZ
edz  ed
<   dZedz  ed<   dZeed<   dZedz  ed<   dZeed<    ee      Zeeef   ed<   edefd       Zy)InstanceDescriptorjobhostruntime_typesource_referenceNinstance_nameservice_namecontainer_nameprocess_name
worker_keyr!   locallocation_typelocation_nameTr1   r2   r4   r   c                     | j                   xs | j                  }| j                  j                   d| j                   d| j
                   d| S )N|)rJ   rI   rF   r   rG   rH   )r7   readables     r   instance_keyzInstanceDescriptor.instance_key<   sK    %%>)>)>((""#1TYYKq1B1B0C1XJOOr    )r;   r<   r=   r)   r?   r>   rJ   rK   rL   rM   rN   r!   rP   rQ   r1   rA   r   rB   r4   r   propertyrU   rC   r    r   rE   rE   +   s    	
I $M3:$#L#*#!%NC$J%#L#*#!Jd
! IsTz  M3  $M3:$GT$T:Hd38n:Pc P Pr    rE   c                       e Zd ZU dZedz  ed<   dZedz  ed<   dZedz  ed<   dZ	e
dz  ed<   dZedz  ed<   dZe
dz  ed<   dZedz  ed<   d
d	Zy)RunDescriptorNexternal_run_id
started_atfinished_at	exit_coderuntime_secondsrecords_processederror_messagec                 N   | j                   t        | j                          | j                  t        | j                         | j                   r0| j                  r$| j                  | j                   k  rt        d      | j                  | j                  dk  rt        d      y y )Nz'finished_at cannot be before started_atr   z"runtime_seconds cannot be negative)rZ   r   r[   r   r]   r7   s    r   r9   zRunDescriptor.__post_init__L   s    ??&T__-'T--.??t//D4D4Dt4VFGG+0D0Dq0HABB 1I+r    r:   )r;   r<   r=   rY   r>   r?   rZ   r   r[   r\   r@   r]   floatr^   r_   r9   rC   r    r   rX   rX   B   sk    "&OS4Z&"&J4&#'KD' IsTz $(OUT\($(sTz( $M3:$Cr    rX   c                   R    e Zd ZU eed<   eed<   eed<   eed<   dZedz  ed<   ddZy)	EvidenceItemkeyr8   sourceobserved_atNr-   c                 .    t        | j                         y r   )r   rg   ra   s    r   r9   zEvidenceItem.__post_init___   s    ))*r    r:   )	r;   r<   r=   r>   r?   r   r   r-   r9   rC   r    r   rd   rd   W   s*    	HJK"Kt"+r    rd   c                      e Zd ZU eed<   eed<   edz  ed<   eed<   eed<   e	ed<   e
ed<   eed	<   eed
<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZeedf   ed<    ee      Zeeef   ed<   ddZy)JobObservationrF   instanceNrunoperational_statehealth_statusobservation_statusseveritystatus_reasonrg   last_activity_atexpected_next_run_atheartbeat_atr\   rC   .evidencer2   raw_payloadc                     | j                   | j                  | j                  | j                  fD ]  }|t	        |        y r   )rg   rr   rs   rt   r   r6   s     r   r9   zJobObservation.__post_init__u   sA    &&(=(=t?X?XZ^ZkZkl 	(E  '	(r    r:   )r;   r<   r=   r)   r?   rE   rX   r
   r   r	   r   r>   r   rr   rs   rt   r\   r@   ru   tuplerd   r   rB   rv   r   r9   rC   r    r   rj   rj   c   s    	  		''))(,ho,,0(T/0$(L(T/( IsTz )+HeL#%&+"'"=Kc3h=(r    rj   c                   6    e Zd ZU eed<   eed<   dZedz  ed<   y)CollectorError
error_typemessageNrU   )r;   r<   r=   r>   r?   rU   rC   r    r   rz   rz   {   s    OL#L#*#r    rz   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   dZee	df   ed<   dZ
eedf   ed	<    ee
      Zeeef   ed<   y)CollectorResultcollector_namecollector_versionrZ   r[   successrC   .observationserrorsr2   diagnosticsN)r;   r<   r=   r>   r?   r   rA   r   rx   rj   r   rz   r   rB   r   r   rC   r    r   r~   r~      s^    M/1L%+,1)+FE.#%&+"'"=Kc3h=r    r~   c                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)NormalizedStatusrm   rn   ro   rp   reasonN)	r;   r<   r=   r
   r?   r   r	   r   r>   rC   r    r   r   r      s    ''))Kr    r   c                   J    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   y)WatcherCycleResultrZ   r[   collectors_totalcollectors_successfulcollectors_failedobservations_createdN)r;   r<   r=   r   r?   r@   rC   r    r   r   r      s&    r    r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dZeedf   ed	<    ee
      Z	eee
f   ed<   ddZy)AgentRegistrationr!   
agent_nameagent_versionenvironmentrG   runtimerC   .capabilitiesr2   r4   Nc                     t        | j                         | j                  r| j                  r| j                  st        d      y )Nz-agent_name, environment and host are required)r%   r!   r   r   rG   r   ra   s    r   r9   zAgentRegistration.__post_init__   s5    4>>*d&6&6diiLMM ?Hr    r:   )r;   r<   r=   r>   r?   r   rx   r   rB   r4   r   r9   rC   r    r   r   r      sQ    NO
IL$&L%S/&$T:Hd38n:Nr    r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<    ee      Z	eee
f   ed<   d	Zed	z  ed
<   ddZy	)RemoteEventevent_idagentrN   r   
event_typeoccurred_atr2   payloadNsequencec                 r   | j                   rt        | j                         dkD  rt        d      | j                  rt        | j                        dkD  rt        d      t	        | j
                         | j                  rt        | j                        dkD  rt        d      t        | j                         y )N   z3event_id must be present and at most 128 characters   z5worker_key must be present and at most 256 characters@   z4event_type must be present and at most 64 characters)	r   r   r   rN   r   r   r   r   r   ra   s    r   r9   zRemoteEvent.__post_init__   s    }}DMM 2S 8RSS#doo"6"<TUU&#doo"6";STT))*r    r:   )r;   r<   r=   r>   r?   r   r   r   rB   r   r   r   r@   r9   rC   r    r   r   r      sL    MOLO#D9GT#s(^9HcDj+r    r   )r#   dataclassesr   r   r   typingr   enumsr   r	   r
   r   timeutilr   r>   r   r%   r)   rE   rX   rd   rj   rz   r~   r   r   r   r   rC   r    r   <module>r      s   	 (   N N &c c # #  $d#Q Q $Q& $d#P P $P, $d#C C $C( $d#+ + $+ $d#( ( $(. $d#$ $ $$ $d#> > $> $d#  $ $d#  $ $d#N N $N  $d#+ + $+r    