
    Hg]             	          d dl Z d dlZd dlZd dlZd dlm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mZmZmZmZmZmZmZmZmZmZ d dlZd dlmZmZmZ d dl m!Z!m"Z" d d	l#m$Z$  ed
d          Z% ede          Z&de&de&fdZ' G d de          Z(ee)dee)ee)e*df         f         df         Z+ G d dej,                  Z- G d d          Z. G d de/          Z0da1 G d d          Z2eded         fd            Z3 G d de/          Z4 ej5        e4e4j6                    G d de4          Z7 ej5        e7e4j6                    G d  d!e4          Z8 ej5        e8e4j6                    G d" d#e4          Z9 ej5        e9e4j6                    G d$ d%e4          Z: ej5        e:e4j6                    G d& d'e4          Z; ej5        e;e4j6                    G d( d)e4          Z< ej5        e<e4j6                    G d* d+e<          Z= ej5        e=e4j6                    G d, d-e<          Z> ej5        e>e4j6                    G d. d/e<          Z? ej5        e?e4j6                    G d0 d1e4          Z@ ej5        e@e4j6                    G d2 d3e4          ZA ej5        eAe4j6                    G d4 d5e4          ZB ej5        eBe4j6                    G d6 d7          ZCdS )8    N)OrderedDict)contextmanager)wraps)
ip_network
ip_address)OptionalDictAnyListUnionCallableIterableTypeTypeVarcast
NamedTupleMappingIterator)HostSpecSpecValidationErrorassert_valid_host)unwrap_ipv6
valid_addr)is_hexServiceSpecTServiceSpec)boundFuncTmethodreturnc           	           t                     dt          dt          dt          dt          f fd            }t          t          |          S )Nclsargskwargsr    c                     	  | g|R i |S # t           t          f$ r/}d                    | j        |          }t	          |          d }~ww xY w)Nz{}: {})	TypeErrorAttributeErrorformat__name__r   )r"   r#   r$   e	error_msgr   s        >/usr/lib/python3/dist-packages/ceph/deployment/service_spec.pyinnerz handle_type_error.<locals>.inner   so    	16#///////>* 	1 	1 	1 a88I%i000	1s    A*A

A)r   r
   r   r   )r   r-   s   ` r,   handle_type_errorr.      s_    
6]]13 1s 1c 1c 1 1 1 1 1 ]1 u    c                       e Zd ZU eed<   eed<   eed<   defdZeedee	ef         dd fd                        Z
defdZedd
            ZddZdS )HostPlacementSpechostnamenetworknamer    c                 n    d}|| j         z  }| j        r|d| j        z   z  }| j        r|d| j        z   z  }|S )N :=)r2   r3   r4   selfress     r,   __str__zHostPlacementSpec.__str__&   sM    t}< 	&3%%C9 	#3?"C
r/   datac                 f    t          |t                    r|                     |          S  | di |S )N )
isinstancestrparse)r"   r=   s     r,   	from_jsonzHostPlacementSpec.from_json/   s8     dC   	#99T??"s{{T{{r/   c                      t          |           S NrA   r:   s    r,   to_jsonzHostPlacementSpec.to_json6   s    4yyr/   Tc                    d}d}d} | ddd          }t          j        ||          }|r)|                    |                    d                    }t          j        ||          }|r)|                    |                    d                    }t          j        ||          }	|	r)|                    |	                    d                    }|s|S t	                      }
|j        }d	|v r d
 |                    d	          D             }
n|dk    r|
                    |           |
D ]}|                    d          s|                    d          r8|                    dd          d         }|	                    dd          d         }	 d|v rt          |           nt          t          |                     # t          $ r}|d}~ww xY w|                                 |S )a  
        Split host into host, network, and (optional) daemon name parts.  The network
        part can be an IP, CIDR, or ceph addrvec like '[v2:1.2.3.4:3300,v1:1.2.3.4:6789]'.
        e.g.,
          "myhost"
          "myhost=name"
          "myhost:1.2.3.4"
          "myhost:1.2.3.4=name"
          "myhost:1.2.3.0/24"
          "myhost:1.2.3.0/24=name"
          "myhost:[v2:1.2.3.4:3000]=name"
          "myhost:[v2:1.2.3.4:3000,v1:1.2.3.4:6789]=name"
        z^(.*?)(:|=|$)z:(.*?)(=|$)z=(.*?)$r6      r2   )r4   )r3   ,c                     g | ]}|S r?   r?   .0xs     r,   
<listcomp>z+HostPlacementSpec.parse.<locals>.<listcomp>f   s    666a666r/   vz[vr7   r   /N)research_replacegrouplistr3   splitappend
startswithrsplitr   r   r   
ValueErrorvalidate)r"   hostrequire_networkhost_reip_rename_re	host_spec
match_host
name_matchip_matchnetworksr3   r*   s                r,   rB   zHostPlacementSpec.parse9   s"   " # CBOO	Yw--
 	I!**J4D4DQ4G4G*HHIYw--
 	E!**
0@0@0C0C*DDI9UD)) 	F!**8>>!3D3D*EEI 	66#'>>667==#5#5666HH"}}((( 	 	G!!#&& 4'*<*<T*B*B 4 "--Q//2!..a003'>>w''''{733444    	s   0G
GGGNc                 .    t          | j                   d S rE   )r   r2   rG   s    r,   r^   zHostPlacementSpec.validate~   s    $-(((((r/   )Tr    N)r)   
__module____qualname__rA   __annotations__r<   classmethodr.   r   dictrC   rH   rB   r^   r?   r/   r,   r1   r1   !   s         MMMLLL
III     U49- 2E     [
     B B B [BH) ) ) ) ) )r/   r1   HostPatternc                       e Zd ZdZdZdS )PatternTypefnmatchregexN)r)   rk   rl   rs   rt   r?   r/   r,   rr   rr      s        GEEEr/   rr   c                   8   e Zd Zdej        fdee         deddfdZdee         dee         fdZ	e
dedd fd	            Zd
edefdZdefdZe
dedd fd            ZdefdZdeeeeef         df         fdZe
deeef         dd fd            ZdefdZdS )rp   Npatternpattern_typer    c                     || _         || _        d | _        | j        t          j        k    r'| j         r"t          j        | j                   | _        d S d S d S rE   )rv   rw   compiled_regexrr   rt   rT   compile)r:   rv   rw   s      r,   __init__zHostPattern.__init__   s[     '.)5" 111dl1"$*T\":":D 2111r/   hostsc                 @     j         sg S  j        r j        t          j        k    rt          j        | j                   S  j        t          j        k    r3 j        st          j         j                    _         fd|D             S t          d j                   )Nc                 H    g | ]}t          j        j        |          |S r?   )rT   matchry   )rO   hr:   s     r,   rQ   z,HostPattern.filter_hosts.<locals>.<listcomp>   s-    III!1Da(H(HIAIIIr/   zGot unexpected pattern_type: )
rv   rw   rr   rs   filterrt   ry   rT   rz   r   r:   r|   s   ` r,   filter_hostszHostPattern.filter_hosts   s    | 	I  	JD$59L$L$L>%666+"333& ?&(j&>&>#IIIIuIIII!"U$BS"U"UVVVr/   argc                 D   |
 |             S t          |t                    r | |          S t          ||           r|S t          |t                    rd|vrt          d|           |d         }|st          d|           t          |t                    sJ d|v rV|d         }|r|dk    r | |t          j                  S |dk    r | |t          j                  S t          d|            | |          S t          d	t          |           d
          )Nrv   z1Got dict for host pattern with no pattern field: z-Got dict for host patternwith empty pattern: rw   rs   rw   rt   z5Got dict for host pattern with unknown pattern type: zCannot convert z object to HostPattern)r@   rA   ro   r   rr   rs   rt   type)r"   r   rv   rw   s       r,   to_host_patternzHostPattern.to_host_pattern   s   ;355LS!! 	 3s88OS!! 	 JT"" 	 ##) +JDG+J +J K K K)nG H) +GAD+G +G H H Hgs+++++$$">2# S|y'@'@3w[5HIIII!W,,3w[5FGGGG- /RLO/R /R S S S3w<<!"UDII"U"U"UVVVr/   otherc                     	 |                      |          }n# t          $ r Y dS w xY w| j        |j        k    o| j        |j        k    S )NF)r   r   rv   rw   )r:   r   other_hps      r,   __eq__zHostPattern.__eq__   s^    	++E22HH" 	 	 	55	|x//^D4EI^4^^s    
&&c                 Z    | j         r| j         nd}| j        t          j        k    rd|z   }|S )Nr6   regex:)rv   rw   rr   rt   r9   s     r,   
pretty_strzHostPattern.pretty_str   s5    
 #l2dll 111S.C
r/   valc                 ^    d|v r | |dd          t           j                  S  | |          S )Nr      r   )rr   rt   )r"   r   s     r,   from_pretty_strzHostPattern.from_pretty_str   s8    s??3s122w[->????3s88Or/   c                 B    d| j          dt          | j                   dS )NzHostPattern(pattern='z', pattern_type=))rv   rA   rw   rG   s    r,   __repr__zHostPattern.__repr__   s(    ```s4K\G]G]````r/   c                 p    | j         r)| j         t          j        k    r| j        | j         j        dS | j        S )N)rv   rw   )rw   rr   rs   rv   r4   rG   s    r,   rH   zHostPattern.to_json   sD     	!2k6I!I!I< $ 1 6   |r/   c                 ,    |                      |          S rE   )r   )r:   r   s     r,   rC   zHostPattern.from_json   s    ##C(((r/   c                     | j         rdS dS NTF)rv   rG   s    r,   __bool__zHostPattern.__bool__   s    < 	4ur/   )r)   rk   rl   rr   rs   r   rA   r{   r   r   rn   HostPatternTyper   r
   boolr   r   r   r   r   r	   rH   rC   r   r?   r/   r,   rp   rp      s       *.-8-@; ;"3-;*;EI; ; ; ;	W$s) 	WS	 	W 	W 	W 	W W/ Wm W W W [W8_C _D _ _ _ _C     # -    [a# a a a asDcND89     )T#s(^ ) ) ) ) [)$      r/   c                      e Zd ZdZ	 	 	 	 	 ddee         deee         ee         df         dee	         dee	         de
f
dZd	efd
Zded	efdZdeee         ee         f         d	dfdZded	ee         fdZdee         d	ee         fdZdee         d	e	fdZd	efdZd	efdZeeded	d fd                        Zd	efdZddZed             ZdS )PlacementSpecz5
    For APIs that need to specify a host subset
    Nlabelr|   countcount_per_hosthost_patternc                     || _         g | _        |r|                     |           || _        || _        t
                              |          | _        |                                  d S rE   )	r   r|   	set_hostsr   r   rp   r   r   r^   )r:   r   r|   r   r   r   s         r,   r{   zPlacementSpec.__init__   sd     

 	"NN5!!!
, *5)D)D\)R)Rr/   r    c                 X    | j         d u o!| j         o| j         o| j        d u o| j        d u S rE   )r   r|   r   r   r   rG   s    r,   is_emptyzPlacementSpec.is_empty  sN    J$ ,J,%%, 
d", #t+	
r/   r   c                     t          |t                    rP| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S t          S rE   )r@   r   r   r|   r   r   r   NotImplementedr:   r   s     r,   r   zPlacementSpec.__eq__  s    e]++ 	C:, CzU[0CzU[0C (E,>>C *e.BB	C
 r/   c                 l    t          d |D                       r	|| _        d S d |D             | _        d S )Nc                 8    g | ]}t          |t                    S r?   )r@   r1   rO   r_   s     r,   rQ   z+PlacementSpec.set_hosts.<locals>.<listcomp>  s#    FFF
4!233FFFr/   c                 J    g | ] }|t                               |d           !S )F)r`   )r1   rB   rN   s     r,   rQ   z+PlacementSpec.set_hosts.<locals>.<listcomp>  s@     / / /A/+11!U1KK / / /r/   )allr|   r   s     r,   r   zPlacementSpec.set_hosts  sR     FFFFFGG 	/DJJJ/ /#(/ / /DJJJr/   _get_hosts_funcc                 @    |                       |d                    S )NT)as_hostspec)filter_matching_hostspecs)r:   r   s     r,   filter_matching_hostsz#PlacementSpec.filter_matching_hosts   s#    --oo$.O.O.OPPPr/   	hostspecsc                       j         rd |D             fd j         D             S  j        r fd|D             nd |D              j        r j                                      S S )Nc                     g | ]	}|j         
S r?   rK   rO   hss     r,   rQ   z;PlacementSpec.filter_matching_hostspecs.<locals>.<listcomp>%      999999r/   c                 0    g | ]}|j         v |j         S r?   rK   )rO   r   	all_hostss     r,   rQ   z;PlacementSpec.filter_matching_hostspecs.<locals>.<listcomp>&  s'    NNN1ajI6M6MAJ6M6M6Mr/   c                 :    g | ]}j         |j        v |j        S r?   )r   labelsr2   )rO   r   r:   s     r,   rQ   z;PlacementSpec.filter_matching_hostspecs.<locals>.<listcomp>(  s)    TTTDJ")<S<S<S<S<Sr/   c                     g | ]	}|j         
S r?   rK   r   s     r,   rQ   z;PlacementSpec.filter_matching_hostspecs.<locals>.<listcomp>*  r   r/   )r|   r   r   r   )r:   r   r   s   ` @r,   r   z'PlacementSpec.filter_matching_hostspecs#  s    : 	O99y999INNNN
NNNN: 	:TTTTyTTTII99y999I 	=$11)<<<r/   c                 v    | j         r| j         S t          |                     |                    | j        pdz  S )NrJ   )r   lenr   r   )r:   r   s     r,   get_target_countzPlacementSpec.get_target_count/  s>    : 	:411)<<==ATAYXYZZr/   c                    g }| j         r7|                    d                    d | j         D                                  | j        r|                    d| j        z             | j        r|                    d| j        z             | j        r|                    d| j        z             | j        r,|                    | j                                                   d                    |          S )z
        >>> #doctest: +SKIP
        ... ps = PlacementSpec(...)  # For all placement specs:
        ... PlacementSpec.from_string(ps.pretty_str()) == ps
        ;c                 ,    g | ]}t          |          S r?   rF   rO   r   s     r,   rQ   z,PlacementSpec.pretty_str.<locals>.<listcomp><  s    ;;;1A;;;r/   zcount:%dzcount-per-host:%dzlabel:%s)r|   rZ   joinr   r   r   r   r   r:   kvs     r,   r   zPlacementSpec.pretty_str4  s     : 	>IIchh;;
;;;<<===: 	/IIj4:-... 	AII)D,??@@@: 	/IIj4:-... 	6IId'2244555xx||r/   c                    g }| j         r|                    d| j         z             | j        r|                    d| j        z             | j        r*|                    dt	          | j                  z             | j        r-|                    d                    | j                             | j        r-|                    d                    | j                             dd                    |          z  S )Nzcount=%dzcount_per_host=%dzlabel=%sz
hosts={!r}zhost_pattern={!r}zPlacementSpec(%s), )	r   rZ   r   r   reprr|   r(   r   r   r   s     r,   r   zPlacementSpec.__repr__G  s    : 	/IIj4:-... 	AII)D,??@@@: 	5IIj4
#3#33444: 	7IIl))$*55666 	EII)001BCCDDD"TYYr]]22r/   r=   c                    |                                 }|                    dg           }|r=g |d<   |D ]5}|d                             t                              |                     6 | di |}|                                 |S )Nr|   r?   )copygetrZ   r1   rC   r^   )r"   r=   cr|   r_   _clss         r,   rC   zPlacementSpec.from_jsonU  s     IIKKgr"" 	EAgJ E E'
!!"3"="=d"C"CDDDDsxxQxxr/   c                     i }| j         r
| j         |d<   | j        rd | j        D             |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r| j                                        |d<   |S )Nr   c                 6    g | ]}|                                 S r?   rH   r   s     r,   rQ   z)PlacementSpec.to_json.<locals>.<listcomp>g  s     @@@T$,,..@@@r/   r|   r   r   r   )r   r|   r   r   r   rH   )r:   rs     r,   rH   zPlacementSpec.to_jsonb  s    : 	$AgJ: 	A@@TZ@@@AgJ: 	$AgJ 	6"&"5A 	< $ 1 9 9 ; ;Anr/   c                    | j         r| j        rt          d          | j        n	 t	          | j                  }n$# t
          t          f$ r t          d          w xY w| j        |k    rt          d          | j        dk     rt          d          | j        n	 t	          | j                  }n$# t
          t          f$ r t          d          w xY w| j        |k    rt          d          | j        dk     rt          d          | j        $| j        s| j         s| j        st          d	          | j        | j        t          d
          | j        4| j         r-t          d | j         D                       rt          d          | j        r| j         rt          d          | j         D ]}|
                                 d S )Nz%Host and label are mutually exclusivez!num/count must be a numeric valuez"num/count must be an integer valuerJ   znum/count must be >= 1z&count-per-host must be a numeric valuez'count-per-host must be an integer valuezcount-per-host must be >= 1zCcount-per-host must be combined with label or hosts or host_patternz'cannot combine count and count-per-hostc                 *    g | ]}|j         p|j        S r?   )r3   r4   r   s     r,   rQ   z*PlacementSpec.validate.<locals>.<listcomp>  s!    DDD2.rwDDDr/   zKcount-per-host cannot be combined explicit placement with names or networksz&cannot combine host patterns and hosts)r|   r   r   r   intr]   r&   r   r   anyr^   )r:   intvalr   s      r,   r^   zPlacementSpec.validatep  s;   : 	O$* 	O%&MNNN:!OTZ	* O O O)*MNNNOzV##)*NOOOzA~~)*BCCC*TT011	* T T T)*RSSST"f,,)*STTT"Q&&)*GHHH*
 +: + $ +
 &U   :!d&9&E%&OPPP#/J 0DDDDDEE 0 &]    	T z T)*RSSS 	 	AJJLLLL	 	s   ; !AB0 0!Cc                    ||sg }n}t          |t                    rVd|v r|                    d          }nNd|v r|                    d          }n4d|v rd|vr|                    d          }n|g}nt          d|z            d}d}|r1	 t	          |d                   }|dd         }n# t
          $ r Y nw xY w|D ]c}|                    d	          rL	 t	          |t          d	          d                   }|                    |            n# t
          $ r Y _w xY wd|D ]c}|                    d
          rL	 t	          |t          d
          d                   }|                    |            n# t
          $ r Y _w xY wdd |D             }|D ]}|                    |           d |D             }t          |          dk    r"t          d	                    |                    |D ]}	|                    |	           |r|d         dd         nd}
|}d}t          |          dk    r"t          d	                    |                    |r t                              |d                   }t          ||||
|          }|S )a  
        A single integer is parsed as a count:

        >>> PlacementSpec.from_string('3')
        PlacementSpec(count=3)

        A list of names is parsed as host specifications:

        >>> PlacementSpec.from_string('host1 host2')
        PlacementSpec(hosts=[HostPlacementSpec(hostname='host1', network='', name=''), HostPlacementSpec(hostname='host2', network='', name='')])

        You can also prefix the hosts with a count as follows:

        >>> PlacementSpec.from_string('2 host1 host2')
        PlacementSpec(count=2, hosts=[HostPlacementSpec(hostname='host1', network='', name=''), HostPlacementSpec(hostname='host2', network='', name='')])

        You can specify labels using `label:<label>`

        >>> PlacementSpec.from_string('label:mon')
        PlacementSpec(label='mon')

        Labels also support a count:

        >>> PlacementSpec.from_string('3 label:mon')
        PlacementSpec(count=3, label='mon')

        You can specify a regex to match with `regex:<regex>`

        >>> PlacementSpec.from_string('regex:Foo[0-9]|Bar[0-9]')
        PlacementSpec(host_pattern=HostPattern(pattern='Foo[0-9]|Bar[0-9]', pattern_type=PatternType.regex))

        fnmatch is the default for a single string if "regex:" is not provided:

        >>> PlacementSpec.from_string('data[1-3]')
        PlacementSpec(host_pattern=HostPattern(pattern='data[1-3]', pattern_type=PatternType.fnmatch))

        >>> PlacementSpec.from_string(None)
        PlacementSpec()
        N r   rL   [zinvalid placement %sr   rJ   zcount:zcount-per-host:c                 d    g | ]-}d |v sd|v st          d |D                       s
d|vrd|v+|.S )r7   r8   c              3      K   | ]}|d v V  	dS )z[]?*:=Nr?   rO   r   s     r,   	<genexpr>z7PlacementSpec.from_string.<locals>.<listcomp>.<genexpr>  s'      >X>XQRqH}>X>X>X>X>X>Xr/   label:r   )r   r   s     r,   rQ   z-PlacementSpec.from_string.<locals>.<listcomp>  sf     1 1 1A"axx3!883>X>XVW>X>X>X;X;X8&a//&a//   0//r/   c                     g | ]}d |v |	S )r   r?   rN   s     r,   rQ   z-PlacementSpec.from_string.<locals>.<listcomp>  s    666A!r/   z more than one label provided: {}r   z'more than one host pattern provided: {})r   r   r|   r   r   )r@   rA   rY   r   r   r]   r[   r   remover(   rp   r   r   )r"   r   stringsr   r   sadvanced_hostspecsa_hr   lr   host_patternsr   pss                 r,   from_stringzPlacementSpec.from_string  sK   \ ;c;GGS!! 	Dczz))C..))C..3
 ))C..%%&<s&BCCC 	GAJ!!""+    	 	A||H%% #h--.. 122ENN1%%%E!   D  	 	A||-.. %(3/@+A+A+B+B)C%D%DNNN1%%%E!   D1 1 1 1 1 & 	  	 CNN366W666v;;??%&H&O&OPV&W&WXXX 	 	ANN1!'1q	!""T.2}!!%9@@OOQ Q Q 	I '66}Q7GHHL*8!3!&(4	6 6 6
 	s6   B, ,
B98B99D
DD<9E77
FF)NNNNNrj   ) r)   rk   rl   __doc__r   rA   r   r   r1   r   r   r{   r   r   r
   r   r   r   r   r   r   r   r   r   r   rn   r.   ro   rC   rH   r^   r   r?   r/   r,   r   r      sN        
 )-JN(,1515  d3i.?)@$FG ! "*#	
  /   ,
$ 
 
 
 
C D    /uT#Y5F0G%GH /T / / / /QX Q$s) Q Q Q Q
8H3E 
$s) 
 
 
 
[(8*< [ [ [ [ [
C    &3# 3 3 3 3 	T 	o 	 	 	  [	    0 0 0 0d u u [u u ur/   r   Tc                       e Zd ZdZddgZdededdfdZdeeef         fdZ	e
deeef         dd fd	            Zedefd
            ZdedefdZdefdZddZdS )CustomConfigzR
    Class to specify custom config files to be mounted in daemon's container
    content
mount_pathr    Nc                 J    || _         || _        |                                  d S rE   )r   r   r^   )r:   r   r   s      r,   r{   zCustomConfig.__init__%  s!    #)r/   c                      | j         | j        dS )Nr   r   r   rG   s    r,   rH   zCustomConfig.to_json*  s    |/
 
 	
r/   r=   c                     | j         D ]}||vrt          d| d          |                                D ]}|| j         vrt          d| d           | di |S )NzCustomConfig must have "z" fieldz CustomConfig got unknown field ""r?   )_fieldsr   keys)r"   r=   ks      r,   rC   zCustomConfig.from_json0  s     	Q 	QA}})*OQ*O*O*OPPP  	S 	SA##)*QQ*Q*Q*QRRR $s{{T{{r/   c                 J    t           j                            | j                  S rE   )ospathbasenamer   rG   s    r,   filenamezCustomConfig.filename:  s    w000r/   r   c                 z    t          |t                    r | j        |j        k    o| j        |j        k    S t          S rE   )r@   r   r   r   r   r   s     r,   r   zCustomConfig.__eq__>  s?    e\** 	- 8Ou'77 r/   c                     d| j          dS )NzCustomConfig(r   )r   rG   s    r,   r   zCustomConfig.__repr__F  s    1t1111r/   c                     t          | j        t                    s$t          dt	          | j                             t          | j        t                    s$t          dt	          | j                             d S )Nz+CustomConfig content must be a string. Got )r@   r   rA   r   r   r   rG   s    r,   r^   zCustomConfig.validateI  s    $,,, 	X%V$t|BTBTVVX X X$/3// 	[%Y$tBWBWYY[ [ [	[ 	[r/   rj   )r)   rk   rl   r   r   rA   r{   r	   r
   rH   rn   rC   propertyr   r   r   r   r^   r?   r/   r,   r   r     s*         ,'G      

c3h 
 
 
 
 T#s(^     [ 1# 1 1 1 X1C D    2# 2 2 2 2[ [ [ [ [ [r/   r   c               #      K   da dV  da dS )z
    I know this is evil, but unfortunately `ceph orch ls`
    may return invalid OSD specs for OSDs not associated to
    and specs. If you have a better idea, please!
    FNT) _service_spec_from_json_validater?   r/   r,   $service_spec_allow_invalid_from_jsonr  R  s#       (-$	EEE'+$$$r/   c                      e Zd ZdZd                                Zd                                ZdgZede	e
         dede	e
         fd            Zde	e
         d	ed
ede
fdZ	 	 	 	 	 	 	 	 	 	 d*dedee         dee         dee         deeeef                  dededeee                  deee                  deee                  deee                  fdZeede	e
         dede
fd                        Zededefd            Zede	e
         dede
fd            ZdefdZdee         fdZdee         fdZd  Z d+d!Z!defd"Z"d#edefd$Z#defd%Z$ed&d'd(d defd)            Z%dS ),r   z
    Details of service creation.

    Request to the orchestrator for a cluster of daemons
    such as MDS, RGW, iscsi gateway, MONs, MGRs, Prometheus

    This structure is supposed to be enough information to
    start the services.
    zalertmanager crash grafana iscsi loki promtail mds mgr mon nfs node-exporter osd prometheus rbd-mirror rgw agent container ingress cephfs-mirror snmp-gatewayz$iscsi mds nfs rgw container ingress mds_join_fsr"   service_typer    c                 "   ddl m} t          t          t          |t
          t          t          t          t          t          t          t          t          t          t          d                    ||           }|t          k    r|st!          d          |S )Nr   )DriveGroupSpec)monrgwnfsosdmdsiscsialertmanageringress	containergrafananode-exporter
prometheuslokipromtailsnmp-gatewayz Spec needs a "service_type" key.)ceph.deployment.drive_groupr
  MONSpecRGWSpecNFSServiceSpecMDSSpecIscsiServiceSpecAlertManagerSpecIngressSpecCustomContainerSpecGrafanaSpecMonitoringSpecPrometheusSpecSNMPGatewaySpecr   r   r   )r"   r  r
  rets       r,   r   zServiceSpec._clsq  s    >>>>>> !!%,","+("&+
 
  #lC
 
 ! 	" +l%&HIII
r/   r#   r$   c                     | t           k    rt                              |           S |                    d|r|d         nd          }|                     |          }t                              |          S )z
        Some Python foo to make sure, we don't have an object
        like `ServiceSpec('rgw')` of type `ServiceSpec`. Now we have:

        >>> type(ServiceSpec('rgw')) == type(RGWSpec('rgw'))
        True

        r  r   N)r   object__new__r   r   )r"   r#   r$   r  sub_clss        r,   r*  zServiceSpec.__new__  sd     +>>#&&&zz.T2K$q''tLLxx--~~g&&&r/   NF
service_id	placementr   config	unmanagedpreview_onlyrh   extra_container_argsextra_entrypoint_argscustom_configsc                 p   |t                      n|| _        |t          j        v s
J |            || _        d | _        | j        | j        v s| j        dk    r|| _        || _        || _        |pg | _	        d | _
        |r#d |                                D             | _
        |	| _        |
| _        || _        d S )Nr  c                 B    i | ]\  }}|                     d d          |S )r   _)replace)rO   r   rR   s      r,   
<dictcomp>z(ServiceSpec.__init__.<locals>.<dictcomp>  s,    MMMda199S#..MMMr/   )r   r-  r   KNOWN_SERVICE_TYPESr  r,  REQUIRES_SERVICE_IDr/  r0  rh   r.  itemsr1  r2  r3  )r:   r  r,  r-  r   r.  r/  r0  rh   r1  r2  r3  s               r,   r{   zServiceSpec.__init__  s     -6,=9{>>>>>>> )  888D<MQV<V<V(DO #( $,>r04 	NMMfllnnMMMDK9M!:O"<Jr/   	json_specc                 `   t          |t                    s t          dt          |           d          |                     |          }|                                }|                    dd          rt|d                             dd          }|                    dd          s|d         |d<   |                    d	d          st          |          dk    r|d         |d	<   |d= |                    dd          }| 	                    |          }d
|v r|d
= |
                    |          S )a  
        Initialize 'ServiceSpec' object data from a json structure

        There are two valid styles for service specs:

        the "old" style:

        .. code:: yaml

            service_type: nfs
            service_id: foo
            pool: mypool
            namespace: myns

        and the "new" style:

        .. code:: yaml

            service_type: nfs
            service_id: foo
            config:
              some_option: the_value
            networks: [10.10.0.0/16]
            spec:
              pool: mypool
              namespace: myns

        In https://tracker.ceph.com/issues/45321 we decided that we'd like to
        prefer the new style as it is more readable and provides a better
        understanding of what fields are special for a give service type.

        Note, we'll need to stay compatible with both versions for the
        the next two major releases (octoups, pacific).

        :param json_spec: A valid dict with ServiceSpec

        :meta private:
        z3Service Spec is not an (JSON or YAML) object. got "r   service_namer6   .rJ   r  r   r,  status)r@   ro   r   rA   normalize_jsonr   r   rY   r   r   _from_json_impl)r"   r<  r   service_type_idr  r   s         r,   rC   zServiceSpec.from_json  sB   R )T** 	Y%Wc)nnWWWY Y Y &&y11	NN 55$$ 	"/55c1==O55,, 7$3A$6.!55r** 5s?/C/Ca/G/G"1!"4,.!uu^R00xx%%q==(##A&&&r/   c                     |                      d          }|| S t          |t                    r| S t          |t                    st	          d| d          |g| d<   | S )Nrh   z
Networks (z%) must be a string or list of strings)r   r@   rX   rA   r   )r<  rh   s     r,   rA  zServiceSpec.normalize_json  sv    ==,,h%% 	(C(( 	d%&b8&b&b&bccc!)
	*r/   c                 N   i }|                                 D ]j\  }}|dk    rt                              |          }|dk    rd |D             }|dk    r|                    |           S|                    ||i           k | di |}t          r|                                 |S )Nr-  r3  c                 B    g | ]}t                               |          S r?   )r   rC   r   s     r,   rQ   z/ServiceSpec._from_json_impl.<locals>.<listcomp>&  s&    :::1\++A..:::r/   specr?   )r;  r   rC   updater  r^   )r"   r<  r#   r   rR   r   s         r,   rB  zServiceSpec._from_json_impl  s    OO%% 	  	 DAqK!++A..$$$:::::F{{AKKAs{{T{{+ 	MMOOOr/   c                 <    | j         }| j        r|d| j        z   z  }|S )Nr?  )r  r,  )r:   ns     r,   r>  zServiceSpec.service_name0  s*    ? 	't&&Ar/   c                     g S rE   r?   rG   s    r,   get_port_startzServiceSpec.get_port_start6  s	     	r/   c                     d S rE   r?   rG   s    r,   get_virtual_ipzServiceSpec.get_virtual_ip;  s    tr/   c                 ~   t                      }| j        |d<   | j        r
| j        |d<   |                                 |d<   | j                                        r| j                                        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j	        r
| j	        |d<   | j
        rd	 | j
        D             |d
<   i }t          | j                                        d           D ]5\  }}||v r
t          |d          r|                                }|r|||<   6|r||d<   |S )Nr  r,  r>  r-  r/  rh   r1  r2  c                 6    g | ]}|                                 S r?   r   r   s     r,   rQ   z'ServiceSpec.to_json.<locals>.<listcomp>P  s     $N$N$NQQYY[[$N$N$Nr/   r3  c                     | d         S )Nr   r?   )tpls    r,   <lambda>z%ServiceSpec.to_json.<locals>.<lambda>S  s
    c!f r/   )keyrH   rG  )r   r  r,  r>  r-  rH   r/  rh   r1  r2  r3  sorted__dict__r;  hasattr)r:   r'  r   rT  r   s        r,   rH   zServiceSpec.to_json>  s   %0]]"/N? 	0 $C"//11N>!!## 	8#~5577C> 	.#~C= 	,"mC
O$ 	D*.*CC&'% 	F+/+EC'( 	O$N$N$:M$N$N$NC !t}2244:L:LMMM 	 	HCczzsI&& $kkmm # 	CK
r/   c                    | j         st          d          | j         dk    rQ| j         | j        v r| j        st          d          | j         | j        vr| j        rt          d| j          d          | j        r6t	          j        dt          | j                            st          d          | j        | j                                         | j	        r;| j	        
                                D ]!\  }}|| j        v rt          d| d	          "| j        pg D ]9}	 t          |           # t          $ r}t          d
| d|           d }~ww xY wd S )Nz!Cannot add Service: type requiredr  zCannot add Service: id requiredzService of type 'z!' should not contain a service idz^[a-zA-Z0-9_.-]+$zCService id contains invalid characters, only [a-zA-Z0-9_.-] allowedzCannot set config option z" in spec: it is managed by cephadmzCannot parse network z: )r  r   r:  r,  rT   r   rA   r-  r^   r.  r;  MANAGED_CONFIG_OPTIONSrh   r   r]   )r:   r   rR   r3   r*   s        r,   r^   zServiceSpec.validate^  s     	K%&IJJJ%% D$<<<T_<)*KLLL (@@@T_@)bT->bbbd d d ? 	I8/T_1E1EFF I) +H I I I >%N##%%%; 	))++  1333-YAYYY   4 }* 	 	G7####   ):G::q::  	 	s   D..
E8EEc                 x    t          j        t          t          |           d          }| j        j         d| dS )NF)default_flow_stylez.from_json(yaml.safe_load('''z''')))yamldumpr   ro   	__class__r)   )r:   ys     r,   r   zServiceSpec.__repr__~  s<    Id4&&5AAA.)PPPPPPr/   r   c                 B    | j         |j         k    o| j        |j        k    S rE   )r^  rV  r   s     r,   r   zServiceSpec.__eq__  s$    %/1 0/	1r/   c                 f    d                     | j        j        |                                           S )Nz<{} for service_name={}>)r(   r^  r)   r>  rG   s    r,   one_line_strzServiceSpec.one_line_str  s)    )001H$J[J[J]J]^^^r/   dumperzyaml.SafeDumperr=   c                     |                      t          t          |                                                                                    S rE   )represent_dictr   r   rH   r;  )rc  r=   s     r,   yaml_representerzServiceSpec.yaml_representer  s4    $$T'4<<>>3G3G3I3I%J%JKKKr/   
NNNNFFNNNNrj   )&r)   rk   rl   r   rY   r9  r:  rY  rn   r   r   rA   r   r
   r*  r   r   r   r	   r   r   r   r{   r.   rC   staticmethodro   rA  rB  r>  rL  rN  rH   r^   r   r   rb  rf  r?   r/   r,   r   r   _  s        IIN  AFFHH $|$ C D<N    [0'T,' ' 's '| ' ' ' '" .26:(,48#(&+15=A>B@D4K 4K"4K%c]4K %]34K !	4K
 "$sCx.14K !4K  $4K $DI.4K (0S	':4K )1c(;4K "*$|*<!=4K 4K 4K 4Kl @'tL) @'d @'| @' @' @'  [@'D 	$ 	4 	 	 	 \	 T,/ D \    [ c    S	    
      @   @Q# Q Q Q Q1C 1D 1 1 1 1
_c _ _ _ _ L!2 L- LC L L L \L L Lr/   c                   4    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 ddedee         dee         deded	eeeef                  d
eee                  dee	         dee         deee                  deee                  deee
                  f fdZdee	         fdZd Z xZS )r  r  NFr  r,  r-  r/  r0  r.  rh   port
virtual_ipr1  r2  r3  c                     |dk    sJ t          t          |                               d|||||||
||
  
         || _        |	| _        d S )Nr  	r,  r-  r/  r0  r.  rh   r1  r2  r3  )superr  r{   rj  rk  )r:   r  r,  r-  r/  r0  r.  rh   rj  rk  r1  r2  r3  r^  s                r,   r{   zNFSServiceSpec.__init__  sm     u$$$$nd##,,j9<HCW"7	 	- 	X 	X 	X 	$r/   r    c                 $    | j         r| j         gS g S rE   rj  rG   s    r,   rL  zNFSServiceSpec.get_port_start  s    9 	I;	r/   c                 0    d|                                  z   S )Nzconf-)r>  rG   s    r,   rados_config_namez NFSServiceSpec.rados_config_name  s    **,,,,r/   )r  NNFFNNNNNNN)r)   rk   rl   rA   r   r   r   r	   r   r   r   r{   rL  rr  __classcell__r^  s   @r,   r  r    sK       %*-16:#(&+4815'+-1=A>B@D% %"%%c]% %]3% !	%
  $% "$sCx.1% $DI.%  }% &c]% (0S	':% )1c(;% "*$|*<!=% % % % % %0S	    
- - - - - - -r/   r  c            .       "    e Zd ZdZej        g dz   Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!dedee         dee         d	ee         d
ee         dee         dee	         dee
e                  dee         dee
e                  dedededeeeef                  dee
e                  dee         dee
e                  dee
e                  dee
e                  dee         dee         dee         f, fdZde
e	         fdZde	fdZd" fd Z xZS )#r  a  
    Settings to configure a (multisite) Ceph RGW

    .. code-block:: yaml

        service_type: rgw
        service_id: myrealm.myzone
        spec:
            rgw_realm: myrealm
            rgw_zonegroup: myzonegroup
            rgw_zone: myzone
            ssl: true
            rgw_frontend_port: 1234
            rgw_frontend_type: beast
            rgw_frontend_ssl_certificate: ...

    See also: :ref:`orchestrator-cli-service-spec`
    )rgw_zone	rgw_realmrgw_zonegrouprgw_frontendsr  NFr  r,  r-  rw  rx  rv  rgw_frontend_portrgw_frontend_ssl_certificatergw_frontend_typergw_frontend_extra_argsr/  sslr0  r.  rh   
subclusterr1  r2  r3  rgw_realm_tokenupdate_endpointszone_endpointsc                 B   |dk    s
J |            |s|r
|r|dz   |z   }t          t          |                               d|||||||||
  
         || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        || _        || _        d S )Nr  r?  rm  )rn  r  r{   rw  rx  rv  rz  r{  r|  r}  r~  r  r  r  )r:   r  r,  r-  rw  rx  rv  rz  r{  r|  r}  r/  r~  r0  r.  rh   r  r1  r2  r3  r  r  r  r^  s                          r,   r{   zRGWSpec.__init__  s    0 u$$$l$$$  	4y 	4X 	4"S83Jgt%%j9%fx!5Mb) 	& 	+ 	+ 	+ )2 -: (00AA])0A<S$. 0,r/   r    c                 ,    |                                  gS rE   get_portrG   s    r,   rL  zRGWSpec.get_port_start        r/   c                 4    | j         r| j         S | j        rdS dS )Ni  P   )rz  r~  rG   s    r,   r  zRGWSpec.get_port  s*    ! 	*))8 	32r/   c                    t          t          |                                            | j        r| j        st          d          | j        r| j        st          d          | j        | j        dvrt          d          d S d S )Nz5Cannot add RGW: Realm specified but no zone specifiedz5Cannot add RGW: Zone specified but no realm specified)beastcivetwebzInvalid rgw_frontend_type value. Valid values are: beast, civetweb.
Additional rgw type parameters can be passed using rgw_frontend_extra_args.)rn  r  r^   rw  rv  r   r|  r:   r^  s    r,   r^   zRGWSpec.validate  s    gt%%'''> 	M$- 	M%KM M M= 	_ 	_%&]^^^!-%-BBB)b   .-BBr/   )r  NNNNNNNNNFFFNNNNNNNFNrj   )r)   rk   rl   r   r   rY  rA   r   r   r   r   r   r	   r   r{   rL  r  r^   rs  rt  s   @r,   r  r    sT        & )? C C C  &+-16:,004+/48EI48@D#("&+4815-1=A>B@D264915-=- =-"=-%c]=- %]3=- %SM	=-
 !)=- $C==- %-SM=- 08S	/B=- %-SM=- +349*==- !=- =-  $=- "$sCx.1=- $DI.=-  &c]!=-" (0S	':#=-$ )1c(;%=-& "*$|*<!='=-( #+3-)=-* $,D>+=-, "*#-=- =- =- =- =- =-~!S	 ! ! ! !#             r/   r  c            '           e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddedee         dee         d	ee         d
ee         dee         dee         dee         dee         dee         dee         dededeeeef                  dee	e                  dee	e                  dee	e                  dee	e
                  f$ fdZde	e         fdZd fdZ xZS )r  r  N  adminFr  r,  pooltrusted_ip_listapi_portapi_userapi_password
api_securessl_certssl_keyr-  r/  r0  r.  rh   r1  r2  r3  c                 0   |dk    sJ t          t          |                               d|||||||||
  
         || _        || _        || _        || _        || _        || _        |	| _	        |
| _
        | j        s| j	        r| j
        rd| _        d S d S d S d S )Nr  rm  T)rn  r  r{   r  r  r  r  r  r  r  r  )r:   r  r,  r  r  r  r  r  r  r  r  r-  r/  r0  r.  rh   r1  r2  r3  r^  s                      r,   r{   zIscsiServiceSpec.__init__2  s    ( w&&&&%%..w:9Bi<H6<xDXEZ>L 	/ 	N 	N 	N 	.  ($  	#4= 	#T\ 	#"DOOO	# 	# 	# 	# 	# 	#r/   r    c                     | j         pdgS )Nr  )r  rG   s    r,   rL  zIscsiServiceSpec.get_port_startc  s    %&&r/   c                     t          t          |                                            | j        st	          d          d S )Nz#Cannot add ISCSI: No Pool specified)rn  r  r^   r  r   r  s    r,   r^   zIscsiServiceSpec.validatef  sI    %%..000y 	7%57 7 7	7 	7r/   )r  NNNr  r  r  NNNNFFNNNNNrj   )r)   rk   rl   rA   r   r   r   r   r	   r   r   r{   rL  r^   rs  rt  s   @r,   r  r  1  s       %,-1'+26+/+2/6.2+/*.6:#(&+4815=A>B@D%/# /#"/#%c]/#  }/# #+3-	/#
 $C=/# $C=/#  (}/# &d^/# $C=/# #3-/# %]3/# !/#  $/# "$sCx.1/# $DI./#  (0S	':!/#" )1c(;#/#$ "*$|*<!=%/# /# /# /# /# /#b'S	 ' ' ' '7 7 7 7 7 7 7 7 7 7r/   r  c            =           e Zd Zdddddddddddddddddddg dddddddddfdedee         deeeef                  deee                  d	ee         d
ee         dee         dee         dee         dee         deee                  deee                  dee         dee         dee         dee	         dee         dee         deee                  deee                  dee	         dee         dee         de	de	de	deee                  d eee                  d!eee
                  f: fd"Zd#ee         fd$Zd#ee         fd%Zd' fd&Z xZS )(r!  r  NF2   r  r,  r.  rh   r-  backend_servicefrontend_portr  r  ssl_dh_paramssl_ciphersssl_optionsmonitor_portmonitor_usermonitor_passwordenable_statskeepalived_passwordrk  virtual_ips_listvirtual_interface_networksuse_keepalived_multicastvrrp_interface_networkfirst_virtual_router_idr/  r~  keepalive_onlyr1  r2  r3  c           
         |dk    sJ t          t          |                               d|||||||           || _        || _        || _        |	| _        |
| _        || _        || _	        || _
        || _        || _        || _        || _        || _        |pg | _        || _        || _        || _        || _        || _        || _        d S )Nr  )r,  r-  r.  rh   r1  r2  r3  )rn  r!  r{   r  r  r  r  r  r  r  r  r  r  r  rk  r  r  r  r  r  r/  r~  r  )r:   r  r,  r.  rh   r-  r  r  r  r  r  r  r  r  r  r  r  r  rk  r  r  r  r  r  r/  r~  r  r1  r2  r3  r^  s                                 r,   r{   zIngressSpec.__init__x  s    > y((((k4  ))*!5"7) 	* 	
 	
 	
  /* (&&(( 0#6 $ 0*D*J'(@%&<#'>$",r/   r    c                     g }| j         -|                    t          t          | j                              | j        -|                    t          t          | j                             |S rE   )r  rZ   r   r   r  )r:   portss     r,   rL  zIngressSpec.get_port_start  s\    )LLc4#566777(LLc4#455666r/   c                     | j         S rE   )rk  rG   s    r,   rN  zIngressSpec.get_virtual_ip  s
    r/   c                 `   t          t          |                                            | j        st	          d          | j        s| j        st	          d          | j        st	          d          | j        s| j	        st	          d          | j        | j	        t	          d          d S d S )Nz0Cannot add ingress: No backend_service specifiedz.Cannot add ingress: No frontend_port specifiedz-Cannot add ingress: No monitor_port specifiedz*Cannot add ingress: No virtual_ip providedz=Cannot add ingress: Single and multiple virtual IPs specified)
rn  r!  r^   r  r   r  r  r  rk  r  r  s    r,   r^   zIngressSpec.validate  s    k4  ))+++# 	D%BD D D" 	B4+= 	B%@B B B  	A%?A A A 	>t'< 	>%<> > >?&4+@+L%OQ Q Q '&+L+Lr/   rj   )r)   rk   rl   rA   r   r	   r   r   r   r   r   r{   rL  rN  r^   rs  rt  s   @r,   r!  r!  w  s       %.-148156:2604+/*./34848/3/337046:-19=CE<A9=:<#("(-=A>B@D;<- <-"<-%c]<- "$sCx.1<- $DI.	<-
 %]3<- #+3-<- !)<- $C=<- #3-<-  (}<- 'tCy1<- 'tCy1<-  (}<-  (}<- $,C=<-   (~!<-" '/sm#<-$ &c]%<-& $,DI#6'<-( .6d3i-@)<-* ,4D>+<-, *2#-<-. +33-/<-0 !1<-2 3<-4 "&5<-6 (0S	':7<-8 )1c(;9<-: "*$|*<!=;<- <- <- <- <- <-|S	        Q Q Q Q Q Q Q Q Q Qr/   r!  c            /       Z    e Zd Zdddddddddddi g g ddg g i dddfdedee         deeeef                  deee                  dee         d	ed
edee         dee         dee	         dee	         deeeef                  deee                  deee                  dee         deeee                           deee	                  deee                  deeee
f                  deee                  deee                  deee                  f, fdZdeee
f         fdZd fdZ xZS )r"  r  NFr  r,  r.  rh   r-  r/  r0  image
entrypointuidgidvolume_mountsr#   envs
privilegedbind_mountsr  dirsfilesr1  r2  r3  c                 4   |dk    sJ |J |J t          t          |                               ||||||||||
  
         || _        |	| _        |
| _        || _        || _        || _        || _	        || _
        || _        || _        || _        || _        d S )Nr  r-  r/  r0  r.  rh   r1  r2  r3  )rn  r"  r{   r  r  r  r  r  r#   r  r  r  r  r  r  )r:   r  r,  r.  rh   r-  r/  r0  r  r  r  r  r  r#   r  r  r  r  r  r  r1  r2  r3  r^  s                          r,   r{   zCustomContainerSpec.__init__  s    0 {****%%%   !4((11*9%f4H"7) 	2 	+ 	+ 	+ 
$*		$&
	


r/   r    c                 B    i }dD ]}t          | |          }||||<   |S )aW  
        Helper function to get the value of the `--config-json` cephadm
        command line option. It will contain all specification properties
        that haven't a `None` value. Such properties will get default
        values in cephadm.
        :return: Returns a dictionary containing all specification
            properties.
        )r  r  r  r  r#   r  r  r  r  r  r  r  )getattr)r:   config_jsonpropvalues       r,   r  zCustomContainerSpec.config_json
  sB     > 	* 	*D D$''E $)D!r/   c                     t          t          |                                            | j        r| j        rt          d          | j        r| j        rt          d          d S d S )NzZ"args" and "extra_container_args" are mutually exclusive (and both serve the same purpose)zU"files" and "custom_configs" are mutually exclusive (and both serve the same purpose))rn  r"  r^   r#   r1  r   r  r3  r  s    r,   r^   zCustomContainerSpec.validate  s    !4((113339 	52 	5%45 5 5 : 	5$- 	5%45 5 5	5 	5 	5 	5r/   rj   )r)   rk   rl   rA   r   r	   r   r   r   r   r
   r   r{   r  r^   rs  rt  s   @r,   r"  r"    s8       %0-148156:#(&+(,-1&*&*;=-/-/.3:>.0-/35=A>B@D-/ /"/%c]/ "$sCx.1/ $DI.	/
 %]3/ !/  $/ !/ &c]/ sm/ sm/ !)c3h 8/  S	*/  S	*/ &d^/  'tDI7!/" !c+#/$  S	*%/& !c3h0'/( (0S	':)/* )1c(;+/, "*$|*<!=-/ / / / / /bT#s(^    $5 5 5 5 5 5 5 5 5 5r/   r"  c                   &    e Zd Z	 	 	 	 	 	 	 	 	 	 ddedee         deeeef                  deee                  dee         ded	ed
ee	         deee                  deee                  deee
                  f fdZdee	         fdZde	fdZ xZS )r$  NFr  r,  r.  rh   r-  r/  r0  rj  r1  r2  r3  c                     |dv sJ t          t          |                               ||||||||	|
|
  
         || _        || _        d S )N)r  r  r  r  r  r  r  )rn  r$  r{   r  rj  )r:   r  r,  r.  rh   r-  r/  r0  rj  r1  r2  r3  r^  s               r,   r{   zMonitoringSpec.__init__.  sz       4 4 4 4 4 	nd##,,*9%f4H"7) 	- 	+ 	+ 	+ )			r/   r    c                 ,    |                                  gS rE   r  rG   s    r,   rL  zMonitoringSpec.get_port_startI  r  r/   c                 F    | j         r| j         S ddddddd| j                 S )Ni#  i#  i#  i  i  ix#  )r  r  r  r  r  r  )rj  r  rG   s    r,   r  zMonitoringSpec.get_portL  sB    9 	99"&%)$(#  $& &
 '+&79 9r/   rg  )r)   rk   rl   rA   r   r	   r   r   r   r   r   r{   rL  r  rs  rt  s   @r,   r$  r$  -  sE        .248156:#(&+'+=A>B@D "%c] "$sCx.1 $DI.	
 %]3 !  $  } (0S	': )1c(; "*$|*<!=     6!S	 ! ! ! !	9# 	9 	9 	9 	9 	9 	9 	9 	9r/   r$  c                   P    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 ddedee         dee         deded	eeeef                  d
eeeef                  dee	e                  dee
         dedee	e                  dee	e                  dee	e                  f fdZde	e
         fdZd fdZ xZS )r   r  NFr  r,  r-  r/  r0  	user_datar.  rh   rj  securer1  r2  r3  c                     |dk    sJ t          t          |                               d|||||||	|||           |pi | _        |
| _        d S )Nr  
r,  r-  r/  r0  r.  rh   rj  r1  r2  r3  )rn  r   r{   r  r  )r:   r  r,  r-  r/  r0  r  r.  rh   rj  r  r1  r2  r3  r^  s                 r,   r{   zAlertManagerSpec.__init__\  sr     ~----%%..z9%fxd!5Mb) 	/ 	+ 	+ 	+* #br/   r    c                 .    |                                  dgS )N#  r  rG   s    r,   rL  zAlertManagerSpec.get_port_start  s    &&r/   c                     t          t          |                                            | j        dk    rt	          d          d S )Nr  z=Port 9094 is reserved for AlertManager cluster listen address)rn  r   r^   rj  r   r  s    r,   r^   zAlertManagerSpec.validate  sM    %%..0009%OQ Q Q r/   )r  NNFFNNNNFNNNrj   )r)   rk   rl   rA   r   r   r   r	   r
   r   r   r   r{   rL  r^   rs  rt  s   @r,   r   r   [  s{       %3-16:#(&+7;4815'+ %=A>B@D& &"&%c]& %]3& !	&
  $& %T#s(^4& "$sCx.1& $DI.&  }& & (0S	':& )1c(;& "*$|*<!=& & & & & &P'S	 ' ' ' 'Q Q Q Q Q Q Q Q Q Qr/   r   c                   .    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddedee         dee         ded	ed
eeeef                  deee                  dedee	         dee         dedeee                  deee                  deee
                  f fdZd fdZ xZS )r#  r  NFTr  r,  r-  r/  r0  r.  rh   only_bind_port_on_networksrj  initial_admin_passwordanonymous_accessr1  r2  r3  c                     |dk    sJ t          t          |                               d|||||||	|||           |
| _        || _        || _        | j        s| j        sd}t          |          d S d S )Nr  r  zEither initial_admin_password must be set or anonymous_access must be set to true. Otherwise the grafana dashboard will be inaccessible.)rn  r#  r{   r  r  r  r   )r:   r  r,  r-  r/  r0  r.  rh   r  rj  r  r  r1  r2  r3  err_msgr^  s                   r,   r{   zGrafanaSpec.__init__  s      y((((k4  ))*9%fxd!5Mb) 	* 	+ 	+ 	+ '=# 0 +E'$ 	/T-H 	/*G &g...		/ 	/ 	/ 	/r/   r    OrderedDict[str, Any]c                     t          t          |                                           }| j        sd|vri |d<   d|d         d<   |S )NrG  Fr  )rn  r#  rH   r  )r:   	json_dictr^  s     r,   rH   zGrafanaSpec.to_json  sV    +t,,4466	$ 	: Y&&$&	&!49If01r/   )r  NNFFNNFNNTNNN)r    r  )r)   rk   rl   rA   r   r   r   r	   r   r   r   r{   rH   rs  rt  s   @r,   r#  r#    sV       %.-16:#(&+481549'+9=*.=A>B@D%/ %/"%/%c]%/ %]3%/ !	%/
  $%/ "$sCx.1%/ $DI.%/ .2%/  }%/ *2#%/ $(%/ (0S	':%/ )1c(;%/ "*$|*<!=%/ %/ %/ %/ %/ %/N         r/   r#  c                   .    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddedee         dee         deded	eeeef                  d
eee                  dedee	         dee         dee         deee                  deee                  deee
                  f fdZ xZS )r%  r  NFr  r,  r-  r/  r0  r.  rh   r  rj  retention_timeretention_sizer1  r2  r3  c                     |dk    sJ t          t          |                               d|||||||	|||           |
r|
                                nd | _        |r|                                nd | _        || _        d S )Nr  r  )rn  r%  r{   stripr  r  r  )r:   r  r,  r-  r/  r0  r.  rh   r  rj  r  r  r1  r2  r3  r^  s                  r,   r{   zPrometheusSpec.__init__  s      |++++nd##,,Z9%fxd!5Mb) 	- 	+ 	+ 	+ 9GPn22444D8FPn22444D*D'''r/   )r  NNFFNNFNNNNNN)r)   rk   rl   rA   r   r   r   r	   r   r   r   r{   rs  rt  s   @r,   r%  r%    sT       %1-16:#(&+481549'+1515=A>B@DE E"E%c]E %]3E !	E
  $E "$sCx.1E $DI.E .2E  }E "*#E "*#E (0S	':E )1c(;E "*$|*<!=E E E E E E E E E Er/   r%  c                       e Zd Z G d deej                  Z G d deej                  Z G d deej                  ZddgZ	d	d
di d
d
d
d
ddd
d
d
d
fdede
e         dedeeef         de
e         de
e         de
e         de
e         dedede
e         de
ee                  de
ee                  de
ee                  f fdZededd f fd            Zedee         fd            Zdee         fd Zd" fd!Z xZS )#r&  c                   "    e Zd ZdZdZdefdZdS )SNMPGatewaySpec.SNMPVersionV2cV3r    c                     | j         S rE   r  rG   s    r,   rH   z#SNMPGatewaySpec.SNMPVersion.to_json  
    :r/   N)r)   rk   rl   r  r  rA   rH   r?   r/   r,   SNMPVersionr    s9        	S 	 	 	 	 	 	r/   r  c                   "    e Zd ZdZdZdefdZdS )SNMPGatewaySpec.SNMPAuthTypeMD5SHAr    c                     | j         S rE   r  rG   s    r,   rH   z$SNMPGatewaySpec.SNMPAuthType.to_json  r  r/   N)r)   rk   rl   r  r  rA   rH   r?   r/   r,   SNMPAuthTyper    9        	S 	 	 	 	 	 	r/   r  c                   "    e Zd ZdZdZdefdZdS )SNMPGatewaySpec.SNMPPrivacyTypeDESAESr    c                     | j         S rE   r  rG   s    r,   rH   z'SNMPGatewaySpec.SNMPPrivacyType.to_json  r  r/   N)r)   rk   rl   r  r  rA   rH   r?   r/   r,   SNMPPrivacyTyper     r  r/   r  z	Name:Portz	IPv4:Portr  Nr6   Fr  snmp_versionsnmp_destinationcredentials	engine_idauth_protocolprivacy_protocolr-  r/  r0  rj  r1  r2  r3  c           	          |dk    sJ t          t          |                               |||	|
|||           || _        || _        || _        || _        || _        || _        || _	        || _
        d S )Nr  )r-  r/  r0  r1  r2  r3  )rn  r&  r{   r  r  r  rj  r  r  r  r  )r:   r  r  r  r  r  r  r  r-  r/  r0  rj  r1  r2  r3  r^  s                  r,   r{   zSNMPGatewaySpec.__init__  s      ~----ot$$--%!5"7) 	. 	+ 	+ 	+ )( 0	&"* 0r/   r<  r    c           
         |                                 }dt          j        fdt          j        fdt          j        fg}||                    di           fD ]X}|D ]S\  }}	 ||v r |||                   ||<   # t          $ r( t          | dd                    |                     w xY wYt          t          |           
                    |          S )Nr  r  r  rG  z unsupported. Must be one of r   )r   r&  r  r  r  r   r]   r   r   rn  rB  )r"   r<  cpytypesdrT  enum_clsr^  s          r,   rB  zSNMPGatewaySpec._from_json_impl0  s!    nn_89o:;!@A

 cggfb))) 	H 	HA!& H HXHaxx!)!C&!1!1#! H H H- /G /G1581D1D/G /G H H HH	H _c**::3???s   !A::2B,c                     | j         pdgS )Ni$  rp  rG   s    r,   r  zSNMPGatewaySpec.portsC  s    	!T""r/   c                     | j         S rE   )r  rG   s    r,   rL  zSNMPGatewaySpec.get_port_startG  s
    zr/   c           
          t          t                                                       j        st	          d           j        st	          d          dgddgd} j        r|d                             d            fd	| j                 D             }|r-t	          d
 j         dd                    |                      j	        radt           j	                  cxk    rdk    r3n n0t           j	                  rt           j	                  dz  dk    rn)t	          d           j        dk    rt	          d           j        st	          d          t           j                  \  }}|st	          d|           | j        vr:t	          d| dd                    t           j                                       d S )Nz`Missing authentication information (credentials). SNMP V2c and V3 require credential informationz#Missing SNMP version (snmp_version)snmp_communitysnmp_v3_auth_usernamesnmp_v3_auth_password)r  r  r  snmp_v3_priv_passwordc                 &    g | ]}|j         v|S r?   )r  )rO   parmr:   s     r,   rQ   z,SNMPGatewaySpec.validate.<locals>.<listcomp>^  s0     4 4 4D$"222 222r/   zSNMP z% credentials are incomplete. Missing r   
   @      r   z]engine_id must be a string containing 10-64 hex characters. Its length must be divisible by 2z3Must provide an engine_id for SNMP V3 notificationsz4SNMP destination (snmp_destination) must be providedz0SNMP destination (snmp_destination) is invalid: z*SNMP destination (snmp_destination) type (z) is invalid. Must be either: )rn  r&  r^   r  r   r  r  rZ   r   r  r   r   r  r   valid_destination_typesrU  )r:   creds_requirementmissingvaliddescriptionr^  s   `    r,   r^   zSNMPGatewaySpec.validateJ  s   ot$$--/// 	%A   " 	%5  
 %%*,CD
 
   	Dd#**+BCCC4 4 4 4$5d6G$H 4 4 4  	%d)ddPTPYPYZaPbPbdd   > 	S((....B.....dn%% /4>""Q&!++)8    D(()I   $ 	%F   ",D,A!B!BE; )T{TT   $">>>)Y Y Y'+yy8T1U1U'V'VY Y   ?>r/   rj   )r)   rk   rl   rA   enumEnumr  r  r  r  r   r	   r   r   r   r   r   r{   rn   ro   rB  r  r  rL  r^   rs  rt  s   @r,   r&  r&    sz           c49       sDI       #ty    	 &47;)+/1,09=?C6:#(&+'+=A>B@D"1 "1""1'4"1 $'"1 #38n	"1
 %SM"1 !) 6"1 $,O#<"1 %]3"1 !"1  $"1  }"1 (0S	':"1 )1c(;"1 "*$|*<!="1 "1 "1 "1 "1 "1H @ @1B @ @ @ @ @ [@$ #tCy # # # X#S	    ; ; ; ; ; ; ; ; ; ;r/   r&  c                        e Zd Z	 	 	 	 	 	 	 	 	 ddedee         dee         deeeef                  ded	ed
eee                  deee                  deee	                  f fdZ
d fdZ xZS )r  r  NFr  r,  r-  r.  r/  r0  r1  r2  r3  c
                 z    |dk    sJ t          t          |                               d||||||||		  	         d S )Nr  )r,  r-  r.  r/  r0  r1  r2  r3  )rn  r  r{   )r:   r  r,  r-  r.  r/  r0  r1  r2  r3  r^  s             r,   r{   zMDSSpec.__init__  se     u$$$$gt%%e
09-3093?;O<Q5C 	& 	E 	E 	E 	E 	Er/   r    c                     t          t          |                                            t          | j                  d                                         rt          d          d S )Nr   z0MDS service id cannot start with a numeric digit)rn  r  r^   rA   r,  isdigitr   r  s    r,   r^   zMDSSpec.validate  s^    gt%%'''t"**,, 	Z%&XYYY	Z 	Zr/   )	r  NNNFFNNNrj   )r)   rk   rl   rA   r   r   r	   r   r   r   r{   r^   rs  rt  s   @r,   r  r    s       %*-16:48#(&+=A>B@DE E"E%c]E %]3E "$sCx.1	E
 !E  $E (0S	':E )1c(;E "*$|*<!=E E E E E E*Z Z Z Z Z Z Z Z Z Zr/   r  c                   8    e Zd Z	 	 	 	 	 	 	 	 	 	 	 ddedee         dee         dee         deeeef                  ded	ed
ee	e                  dee	e                  dee	e                  dee	e
                  deeee	e         f                  f fdZddZ xZS )r  NFr  r,  r-  r   r.  r/  r0  rh   r1  r2  r3  crush_locationsc                     |dk    sJ t          t          |                               d||||||||	|
|           || _        |                                  d S )Nr  )
r,  r-  r   r.  r/  r0  rh   r1  r2  r3  )rn  r  r{   r  r^   )r:   r  r,  r-  r   r.  r/  r0  rh   r1  r2  r3  r  r^  s                r,   r{   zMONSpec.__init__  sz     u$$$$gt%%e
09,1-3093?/7;O<Q5C 	& 		E 		E 		E  /r/   r    c                 J   | j         r| j                                         D ]\  }}	 t          |           n&# t          $ r}d| }t          |          d }~ww xY w|D ]@}d|vs&t	          |                    d                    dk    rd| }t          |          Ad S d S )Nz0Invalid hostname found in spec crush locations: r8   r  zKCrush locations must be of form <bucket>=<location>. Found crush location: )r  r;  r   r   r   rY   )r:   r_   
crush_locsr*   err_strclocs         r,   r^   zMONSpec.validate  s     	;$($8$>$>$@$@ 
; 
; j7%d++++* 7 7 7TQRTTG-g6667 ' ; ;D$#djjoo*>*>!*C*C$C<@$C $C1'::: +D;	; 	;
; 
;s   7
AAA)NNNNFFNNNNNrj   )r)   rk   rl   rA   r   r   r   r	   r   r   r   r{   r^   rs  rt  s   @r,   r  r    s>        .26:(,48#(&+15=A>B@DCG "%c] %]3 !	
 "$sCx.1 !  $ $DI. (0S	': )1c(; "*$|*<!= #+4T#Y+?"@     :; ; ; ; ; ; ; ;r/   r  c            
           e Zd Z	 	 ddedee         deeeef                  fdZedeee	f         dd fd            Z
deee	f         fd	Zd
e	defdZdefdZddZdS )TunedProfileSpecNprofile_namer-  settingsc                 b    || _         |pt          d          | _        |pi | _        d| _        d S )N*)r   r6   )r"  r   r-  r#  _last_updated)r:   r"  r-  r#  s       r,   r{   zTunedProfileSpec.__init__  s<    
 )"Em&E&E&E B"$r/   rG  r    c                    i }d|vrt          d          |d         |d<   t          |d         t                    st          d          d|v r#t                              |d                   |d<   d|v r|d         |d<    | di |S )Nr"  z4Tuned profile spec must include "profile_name" fieldz%"profile_name" field must be a stringr-  r#  r?   )r   r@   rA   r   rC   )r"   rG  r=   s      r,   rC   zTunedProfileSpec.from_json  s    %%%&\]]]#N3^$~.44 	O%&MNNN$ - 7 7[8I J JD#J/Ds{{T{{r/   c                 j    i }| j         |d<   | j                                        |d<   | j        |d<   |S )Nr"  r-  r#  )r"  r-  rH   r#  r9   s     r,   rH   zTunedProfileSpec.to_json  s<     "/N>1133K-J
r/   r   c                     t          |t                    r4| j        |j        k    r"| j        |j        k    r| j        |j        k    rdS dS t
          S r   )r@   r!  r-  r"  r#  r   r   s     r,   r   zTunedProfileSpec.__eq__  sT    e-.. 	%/11%);;;MU^33t5r/   c                     d| j          dS )NzTunedProfile(r   )r"  rG   s    r,   r   zTunedProfileSpec.__repr__  s    3t03333r/   c                 f    t          | j        | j        | j                                                  S rE   )r!  r"  r-  r#  r   rG   s    r,   r   zTunedProfileSpec.copy	  s)       14>4=CUCUCWCWXXXr/   )NN)r    r!  )r)   rk   rl   rA   r   r   r	   r{   rn   r
   rC   rH   r   r   r   r   r?   r/   r,   r!  r!    s        7;6:% %"%$]3% $DcN3% % % % T#s(^ 0B    [c3h    	C 	D 	 	 	 	4# 4 4 4 4Y Y Y Y Y Yr/   r!  )Drs   r   rT   r  collectionsr   
contextlibr   	functoolsr   	ipaddressr   r   typingr   r	   r
   r   r   r   r   r   r   r   r   r   r   r\  ceph.deployment.hostspecr   r   r   ceph.deployment.utilsr   r   
ceph.utilsr   r   r   r.   r1   rA   r   r   r  rr   rp   r)  r   r  r   r  r   add_representerrf  r  r  r  r!  r"  r$  r   r#  r%  r&  r  r  r!  r?   r/   r,   <module>r5     s	    				 				  # # # # # # % % % % % %       , , , , , , , ," " " " " " " " " " " " " " " " " " " " " " " " " " " " " "  U U U U U U U U U U 9 9 9 9 9 9 9 9      w~];;;x(((e     ^) ^) ^) ^) ^)
 ^) ^) ^)B T4U3d?-C(C#DmST    $)   
\ \ \ \ \ \ \ \~o o o o oF o o od	 $(  1[ 1[ 1[ 1[ 1[ 1[ 1[ 1[h 	,htn 	, 	, 	, 	,mL mL mL mL mL& mL mL mL`	  [+"> ? ? ? -  -  -  -  -[  -  -  -F  ^[%A B B Bs s s s sk s s sl  Wk: ; ; ;:7 :7 :7 :7 :7{ :7 :7 :7F  %{'C D D D[Q [Q [Q [Q [Q+ [Q [Q [Q|  [+"> ? ? ?O5 O5 O5 O5 O5+ O5 O5 O5d  (+*F G G G(9 (9 (9 (9 (9[ (9 (9 (9V  ^[%A B B B1Q 1Q 1Q 1Q 1Q~ 1Q 1Q 1Qh  %{'C D D D8 8 8 8 8. 8 8 8v  [+"> ? ? ?E E E E E^ E E E<  ^[%A B B BT T T T Tk T T Tn  _k&B C C CZ Z Z Z Zk Z Z Z:  Wk: ; ; ;*; *; *; *; *;k *; *; *;Z  Wk: ; ; ;1Y 1Y 1Y 1Y 1Y 1Y 1Y 1Y 1Y 1Yr/   