PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /opt/saltstack/salt/lib/python3.10/site-packages/salt/modules
Viewing File: /opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/grafana4.py
""" Module for working with the Grafana v4 API .. versionadded:: 2017.7.0 :depends: requests :configuration: This module requires a configuration profile to be configured in the minion config, minion pillar, or master config. The module will use the 'grafana' key by default, if defined. For example: .. code-block:: yaml grafana: grafana_url: http://grafana.localhost grafana_user: admin grafana_password: admin grafana_timeout: 3 """ try: import requests HAS_LIBS = True except ImportError: HAS_LIBS = False __virtualname__ = "grafana4" def __virtual__(): """ Only load if requests is installed """ if HAS_LIBS: return __virtualname__ else: return ( False, 'The "{}" module could not be loaded: "requests" is not installed.'.format( __virtualname__ ), ) def _get_headers(profile): headers = {"Content-type": "application/json"} if profile.get("grafana_token", False): headers["Authorization"] = "Bearer {}".format(profile["grafana_token"]) return headers def _get_auth(profile): if profile.get("grafana_token", False): return None return requests.auth.HTTPBasicAuth( profile["grafana_user"], profile["grafana_password"] ) def get_users(profile="grafana"): """ List all users. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_users """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.get( "{}/api/users".format(profile["grafana_url"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_user(login, profile="grafana"): """ Show a single user. login Login of the user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_user <login> """ data = get_users(profile) for user in data: if user["login"] == login: return user return None def get_user_data(userid, profile="grafana"): """ Get user data. userid Id of the user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_user_data <user_id> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.get( "{}/api/users/{}".format(profile["grafana_url"], userid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def create_user(profile="grafana", **kwargs): """ Create a new user. login Login of the new user. password Password of the new user. email Email of the new user. name Optional - Full name of the new user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.create_user login=<login> password=<password> email=<email> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.post( "{}/api/admin/users".format(profile["grafana_url"]), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_user(userid, profile="grafana", **kwargs): """ Update an existing user. userid Id of the user. login Optional - Login of the user. email Optional - Email of the user. name Optional - Full name of the user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_user <user_id> login=<login> email=<email> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.put( "{}/api/users/{}".format(profile["grafana_url"], userid), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_user_password(userid, profile="grafana", **kwargs): """ Update a user password. userid Id of the user. password New password of the user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_user_password <user_id> password=<password> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.put( "{}/api/admin/users/{}/password".format(profile["grafana_url"], userid), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_user_permissions(userid, profile="grafana", **kwargs): """ Update a user password. userid Id of the user. isGrafanaAdmin Whether user is a Grafana admin. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_user_permissions <user_id> isGrafanaAdmin=<true|false> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.put( "{}/api/admin/users/{}/permissions".format(profile["grafana_url"], userid), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def delete_user(userid, profile="grafana"): """ Delete a user. userid Id of the user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.delete_user <user_id> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.delete( "{}/api/admin/users/{}".format(profile["grafana_url"], userid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_user_orgs(userid, profile="grafana"): """ Get the list of organisations a user belong to. userid Id of the user. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_user_orgs <user_id> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.get( "{}/api/users/{}/orgs".format(profile["grafana_url"], userid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def delete_user_org(userid, orgid, profile="grafana"): """ Remove a user from an organization. userid Id of the user. orgid Id of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.delete_user_org <user_id> <org_id> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.delete( "{}/api/orgs/{}/users/{}".format(profile["grafana_url"], orgid, userid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_orgs(profile="grafana"): """ List all organizations. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_orgs """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.get( "{}/api/orgs".format(profile["grafana_url"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_org(name, profile="grafana"): """ Show a single organization. name Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_org <name> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.get( "{}/api/orgs/name/{}".format(profile["grafana_url"], name), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def switch_org(orgname, profile="grafana"): """ Switch the current organization. name Name of the organization to switch to. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.switch_org <name> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) org = get_org(orgname, profile) response = requests.post( "{}/api/user/using/{}".format(profile["grafana_url"], org["id"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return org def get_org_users(orgname=None, profile="grafana"): """ Get the list of users that belong to the organization. orgname Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_org_users <orgname> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.get( "{}/api/org/users".format(profile["grafana_url"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def create_org_user(orgname=None, profile="grafana", **kwargs): """ Add user to the organization. loginOrEmail Login or email of the user. role Role of the user for this organization. Should be one of: - Admin - Editor - Read Only Editor - Viewer orgname Name of the organization in which users are added. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.create_org_user <orgname> loginOrEmail=<loginOrEmail> role=<role> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.post( "{}/api/org/users".format(profile["grafana_url"]), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_org_user(userid, orgname=None, profile="grafana", **kwargs): """ Update user role in the organization. userid Id of the user. loginOrEmail Login or email of the user. role Role of the user for this organization. Should be one of: - Admin - Editor - Read Only Editor - Viewer orgname Name of the organization in which users are updated. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_org_user <user_id> <orgname> loginOrEmail=<loginOrEmail> role=<role> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.patch( "{}/api/org/users/{}".format(profile["grafana_url"], userid), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def delete_org_user(userid, orgname=None, profile="grafana"): """ Remove user from the organization. userid Id of the user. orgname Name of the organization in which users are updated. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.delete_org_user <user_id> <orgname> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.delete( "{}/api/org/users/{}".format(profile["grafana_url"], userid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_org_address(orgname=None, profile="grafana"): """ Get the organization address. orgname Name of the organization in which users are updated. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_org_address <orgname> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.get( "{}/api/org/address".format(profile["grafana_url"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_org_address(orgname=None, profile="grafana", **kwargs): """ Update the organization address. orgname Name of the organization in which users are updated. address1 Optional - address1 of the org. address2 Optional - address2 of the org. city Optional - city of the org. zip_code Optional - zip_code of the org. state Optional - state of the org. country Optional - country of the org. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_org_address <orgname> country=<country> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.put( "{}/api/org/address".format(profile["grafana_url"]), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_org_prefs(orgname=None, profile="grafana"): """ Get the organization preferences. orgname Name of the organization in which users are updated. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_org_prefs <orgname> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.get( "{}/api/org/preferences".format(profile["grafana_url"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_org_prefs(orgname=None, profile="grafana", **kwargs): """ Update the organization preferences. orgname Name of the organization in which users are updated. theme Selected theme for the org. homeDashboardId Home dashboard for the org. timezone Timezone for the org (one of: "browser", "utc", or ""). profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_org_prefs <orgname> theme=<theme> timezone=<timezone> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.put( "{}/api/org/preferences".format(profile["grafana_url"]), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def create_org(profile="grafana", **kwargs): """ Create a new organization. name Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.create_org <name> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.post( "{}/api/orgs".format(profile["grafana_url"]), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_org(orgid, profile="grafana", **kwargs): """ Update an existing organization. orgid Id of the organization. name New name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_org <org_id> name=<name> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.put( "{}/api/orgs/{}".format(profile["grafana_url"], orgid), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def delete_org(orgid, profile="grafana"): """ Delete an organization. orgid Id of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.delete_org <org_id> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.delete( "{}/api/orgs/{}".format(profile["grafana_url"], orgid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_datasources(orgname=None, profile="grafana"): """ List all datasources in an organisation. orgname Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_datasources <orgname> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.get( "{}/api/datasources".format(profile["grafana_url"]), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_datasource(name, orgname=None, profile="grafana"): """ Show a single datasource in an organisation. name Name of the datasource. orgname Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_datasource <name> <orgname> """ data = get_datasources(orgname=orgname, profile=profile) for datasource in data: if datasource["name"] == name: return datasource return None def create_datasource(orgname=None, profile="grafana", **kwargs): """ Create a new datasource in an organisation. name Name of the data source. type Type of the datasource ('graphite', 'influxdb' etc.). access Use proxy or direct. url The URL to the data source API. user Optional - user to authenticate with the data source. password Optional - password to authenticate with the data source. database Optional - database to use with the data source. basicAuth Optional - set to True to use HTTP basic auth to authenticate with the data source. basicAuthUser Optional - HTTP basic auth username. basicAuthPassword Optional - HTTP basic auth password. jsonData Optional - additional json data to post (eg. "timeInterval"). isDefault Optional - set data source as default. withCredentials Optional - Whether credentials such as cookies or auth headers should be sent with cross-site requests. typeLogoUrl Optional - Logo to use for this datasource. orgname Name of the organization in which the data source should be created. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.create_datasource """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.post( "{}/api/datasources".format(profile["grafana_url"]), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def update_datasource(datasourceid, orgname=None, profile="grafana", **kwargs): """ Update a datasource. datasourceid Id of the datasource. name Name of the data source. type Type of the datasource ('graphite', 'influxdb' etc.). access Use proxy or direct. url The URL to the data source API. user Optional - user to authenticate with the data source. password Optional - password to authenticate with the data source. database Optional - database to use with the data source. basicAuth Optional - set to True to use HTTP basic auth to authenticate with the data source. basicAuthUser Optional - HTTP basic auth username. basicAuthPassword Optional - HTTP basic auth password. jsonData Optional - additional json data to post (eg. "timeInterval"). isDefault Optional - set data source as default. withCredentials Optional - Whether credentials such as cookies or auth headers should be sent with cross-site requests. typeLogoUrl Optional - Logo to use for this datasource. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.update_datasource <datasourceid> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.put( "{}/api/datasources/{}".format(profile["grafana_url"], datasourceid), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() # temporary fix for https://github.com/grafana/grafana/issues/6869 # return response.json() return {} def delete_datasource(datasourceid, orgname=None, profile="grafana"): """ Delete a datasource. datasourceid Id of the datasource. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.delete_datasource <datasource_id> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) response = requests.delete( "{}/api/datasources/{}".format(profile["grafana_url"], datasourceid), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def get_dashboard(slug, orgname=None, profile="grafana"): """ Get a dashboard. slug Slug (name) of the dashboard. orgname Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.get_dashboard <slug> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.get( "{}/api/dashboards/db/{}".format(profile["grafana_url"], slug), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) data = response.json() if response.status_code == 404: return None if response.status_code >= 400: response.raise_for_status() return data.get("dashboard") def delete_dashboard(slug, orgname=None, profile="grafana"): """ Delete a dashboard. slug Slug (name) of the dashboard. orgname Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.delete_dashboard <slug> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.delete( "{}/api/dashboards/db/{}".format(profile["grafana_url"], slug), auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json() def create_update_dashboard(orgname=None, profile="grafana", **kwargs): """ Create or update a dashboard. dashboard A dict that defines the dashboard to create/update. overwrite Whether the dashboard should be overwritten if already existing. orgname Name of the organization. profile Configuration profile used to connect to the Grafana instance. Default is 'grafana'. CLI Example: .. code-block:: bash salt '*' grafana4.create_update_dashboard dashboard=<dashboard> overwrite=True orgname=<orgname> """ if isinstance(profile, str): profile = __salt__["config.option"](profile) if orgname: switch_org(orgname, profile) response = requests.post( "{}/api/dashboards/db".format(profile.get("grafana_url")), json=kwargs, auth=_get_auth(profile), headers=_get_headers(profile), timeout=profile.get("grafana_timeout", 3), ) if response.status_code >= 400: response.raise_for_status() return response.json()